A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

偶然看到这张图片,感觉很有意思 就尝试做了一下

思路如下:
首先获取gif中的一帧,然后对这一帧图片进行遍历,查看每一个位置的像素,根据颜色来替换为一个字符
. ` : ; 1 j o a B M X W # @

就像上面给出的字符一样,整体的颜色是如浅到深。


具体如何映射呢?我们知道RGB的值是连续的,有很多,而我们不可能对每一个值都给一个字符,这就要将RGB的颜色值划分为一些区间,各个区间映射到字符数组的每一个字符中,所以采取的方式就是取整运算 “ / ”, 这样可以将RGB的值转化成 0 ~ arr.length-1 的范围,也就可以完成图片中像素值的转化。

于是,问题就先拆分成对一张图片的转化。
分析到这里,应该可以预见到一个问题:
一张图片的像素很多,如果每一个像素都对应一个字符,那么生成的字符图片也太大了。


就像下图一样

上面这个问题的原因就是字符图片的像素太高!


所以我们要减少像素,也就是减少字符的总量。这样一个字符就不能代表一个点,而是一个区域。而一个区域内的RGB值怎么计算?我这里采用的是取平均数。


有了这个思路,就进一步完善我们的算法。
这时候再次处理同一张图片,我们就会发现,“字符图片”的分辨率降低了。这次截图可以将整个图片都截进来,但是清晰度也降低了。

到了这一步,发现基本技术已经满足了需求。
剩下的就是gif的问题了。如何读取gif中的每一帧,然后进行转化。
还有一个问题就是,我之前做的都是将字符写在文本文件中,为了做成gif,应该生成一个jpg或者其他格式的一些图片。
也就是说将字符写入到BufferedImage中,然后用ImageIO.write方法生成一个图片。
字符如何写入BufferedImage中,涉及到了一些字体、字号、字符间距的设置,还有字符图片与原图片的比例等等,这里就不一一赘述。
期间也绕了一些弯路,先是用Swing的JTextArea来做的,后来发现效果极差。。因为这个textArea控件居然都不会把字符自动对齐。
现在回到了BufferedImage上面。
经过了上面的弯路,还有一些参数的调优,终于可以生成了n张独立的jpg图片。
我上网调查了一下,Java如果将一些jpg整合成gif,需要一个额外的包。AnimatedGifEncoder包,我简单查了一下,都是积分下载,就没有去弄。。。
直接拿生成的图片用一些其他工具整合成gif得了,这里偷个懒。

效果图:




最后是源码
Img2CharImg.rar (11.81 KB, 下载次数: 73)

2 个回复

倒序浏览
有创意 赞一个:)
回复 使用道具 举报
思路很清晰
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马