飞道的博客

25行Java代码将普通图片转换为字符画图片和文本

242人阅读  评论(0)

原图

生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用notepad++等软件打开)

生成字符画图片(背景颜色和画笔颜色代码里可设置调节)

 

新建普通java 项目,Java单类实现代码,复制到java项目中,用idea编辑器 主方法运行。(引入的Class 都是JDK中自有的)


  
  1. import javax.imageio.ImageIO;
  2. import java.awt.*;
  3. import java.awt.image.BufferedImage;
  4. import java.io.*;
  5. public class ImageToASCII {
  6. //三十二位颜色
  7. private final static char[] color = { ' ', '`', '.', '^', ',', ':', '~', '"',
  8. '<', '!', 'c', 't', '+', '{', 'i', '7', '?', 'u', '3', '0', 'p', 'w',
  9. '4', 'A', '8', 'D', 'X', '%', '#', 'H', 'W', 'M'};
  10. /**
  11. * 图片转字符画文本
  12. */
  13. public static void createCharTxt( String path, String fileUrl) {
  14. try {
  15. BufferedImage image = ImageIO.read( new File(path));
  16. StringBuilder imageToAscii = imageToAscii(image);
  17. FileWriter fileWriter = new FileWriter(fileUrl);
  18. fileWriter.write(imageToAscii.toString());
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. /**
  24. * 图片转字符
  25. */
  26. public static StringBuilder imageToAscii(BufferedImage image) {
  27. StringBuilder sb = new StringBuilder();
  28. int width = image.getWidth();
  29. int height = image.getHeight();
  30. for ( int y = 0; y < height; y++) {
  31. for ( int x= 0; x < width; x++) {
  32. sb.append(rgbToChar(image,x,y)+ " ");
  33. }
  34. sb.append( "\n");
  35. }
  36. return sb;
  37. }
  38. /**
  39. * 像素转字节
  40. */
  41. public static char rgbToChar(BufferedImage image, int x, int y){
  42. int rgb = image.getRGB(x, y);
  43. int R = (rgb & 0xff0000) >> 16;
  44. int G = (rgb & 0x00ff00) >> 8;
  45. int B = rgb & 0x0000ff;
  46. int gray = (R * 30 + G * 59 + B * 11 + 50) / 100;
  47. int index = 31 * gray / 255;
  48. return color[index];
  49. }
  50. /**
  51. * @Description: 生成字符码图片
  52. * @param imgPath 图片路径
  53. * @param fileUrl 输出图片路径
  54. * @param more 放大倍数
  55. * @throws
  56. */
  57. public static void createCharImg( String imgPath, String fileUrl, int more){
  58. try {
  59. FileInputStream fileInputStream = new FileInputStream(imgPath);
  60. BufferedImage image = ImageIO.read(fileInputStream);
  61. //生成字符图片
  62. int w = image.getWidth();
  63. int h = image.getHeight();
  64. BufferedImage imageBuffer = new BufferedImage(w*more, h*more, 1);;
  65. Graphics g = imageBuffer.getGraphics();
  66. //设置背景色
  67. g.setColor(Color.white); // 画笔颜色
  68. g.fillRect( 0, 0, w*more, h*more); // 填充图形背景
  69. // 设置字体
  70. g.setFont( new Font( "宋体", Font.ITALIC, more)); //more*2:字体高度
  71. g.setColor(Color.black); // 画笔颜色
  72. // 绘制字符
  73. for ( int y = 0; y < h; y++) {
  74. for ( int x = 0; x< w; x++) {
  75. g.drawString(rgbToChar(image,x,y)+ " ", x*more, (y+ 1)*more); //绘制每行字体位置,主要y轴改变
  76. }
  77. }
  78. g.dispose();
  79. ImageIO.write(imageBuffer, "jpg", new File(fileUrl)); //输出图片
  80. System.out.println( "字符画图片生成");
  81. } catch ( Exception e) {
  82. e.printStackTrace();
  83. }
  84. }
  85. /**
  86. * @Description: 生成字符码图片
  87. * @param imgPath 图片路径
  88. * @param fileUrl 输出图片路径
  89. * @more 放大倍数
  90. */
  91. public static void createCharImg( String imgPath, String fileUrl){
  92. createCharImg(imgPath,fileUrl, 1);
  93. }
  94. public static void main( String[] args) throws IOException {
  95. createCharImg( "C:\\Users\\tarzan\\Desktop\\home.jpg", "C:\\Users\\tarzan\\Desktop\\a.jpg");
  96. createCharTxt( "C:\\Users\\tarzan\\Desktop\\home.jpg", "C:\\Users\\tarzan\\Desktop\\a.txt");
  97. }
  98. }

运行结果截图

 

 

 

更多推荐

《震惊,java仅用30行代码就实现了视频转音频的批量转换》


转载:https://blog.csdn.net/weixin_40986713/article/details/116045299
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场