多语言展示
当前在线:805今日阅读:86今日分享:14

java实现图片转字符画

最近在抖音上特别流行字符画,今天小编就来教大家来使用java语言通过编程来迅速实现图片转字符画。
工具/原料
1

电脑一台

2

eclipse软件

方法/步骤
1

首先先不多说,小编这里直接上代码,整体代码比较少,总共也就三十几行,去掉空行更是少得可怜,有兴趣的大家可以试一下,代码如下图:

2

接下来小编开始解释一下代码中比较重要的一些代码,代码:final String base = '@#&$%*o!;.';// 字符串由复杂到简单这里是定义了一个简单的字符串,注意后面的注释,一定要按照注释来,因为这里的顺序和后面灰度值的顺序是相对应的,如下图:

3

代码:final BufferedImage image = ImageIO.read(new File(path));这里使用java的内置包ImageIO,read方法表示将文件读取进来,如下图:

4

代码:for (int y = 0; y < image.getHeight(); y += 8) {           for (int x = 0; x < image.getWidth(); x+=4) {上面步骤中读取进来的图像文件image,这里通过两个for循环依次读取image图像文件的每个像素点,getHeight()和getWidth()表示图像文件的高和宽,如下图:

5

代码:final int pixel = image.getRGB(x, y);这里使用了getRGB()方法,这个方法通过图像中每个像素点的位置得到这个点ARGB像素值,并将ARGB像素值存储到rgbData数组中,rgbData数组中的数据是以0xAARRGGBB格式存储的,也就是十六进制储存,所以这个方法得到的结果是一个8位整数,如下图:

6

代码:final int r = (pixel & 0xff0000) >> 16, g = (pixel & 0xff00) >> 8, b = pixel & 0xff;上个步骤中pixel为8位整数,r为红色值,pixel & 0xff0000中pixel为八位整数,这个&表示与,又因为rgbData数组中的数据是以0xAARRGGBB格式存储的,所以可以知道r颜色储存在从左往右第3/4位,所以pixel & 0xff0000就是要把第3/4位取出来,其他位变成0,>>表示以为运算,可以知道r颜色的右边还有4位数,又由于是十六进制,所以4位十六进制表示16位二进制,所有>>16,最终得到r值,r的值位0-255,同理可得b,g值,如下图:

7

代码:final float gray = 0.299f * r + 0.578f * g + 0.114f * b;这里代码是将rgb值转化成灰度值,这里r、g、b之前的常数是固定值,这个公式是rgb转换灰度值的一种加权常用算法,不必太深究,转换成的灰度值gray范围为0-255,如下图:

8

代码:final int index = Math.round(gray * (base.length() + 1) / 255);这里base我们是自己设置的,长度为10,然后加1,然后灰度值与这个值乘法,然后再做除法,最终得到的index值得范围为0-11,可以知道值越小,颜色越黑,反之越白,如下图:

9

代码:System.out.print(index >= base.length() ? ' ' : String.valueOf(base.charAt(index)));这里从上个步骤可以知道index的取值范围为0-11,base的长度为10,所以这句代码的意思就是如果index的值在0-10范围就对应的使用base字符串中对应位置的字符代替,超出范围的用空白代替,如下图:

10

下图是小编找到的一张比较可爱的图,如下图:

11

然后将上个步骤中的图片位置填写到程序中,然后运行程序,得到运行结果如下图:

12

当然也可以复制下来保存在文本文档中,发送给朋友,如下图:

13

这个程序的整体思想是:读取图片->读取图片的每个像素点的rgb信息->将每个像素的rgb信息转化成对应的灰度值->将灰度值分成11等分->每份对应一个字符->得到字符画

注意事项
1

个人观点,仅供参考。

2

感谢阅读。

推荐信息