前几天,我在装linux软件的时候,发现一个比较好玩儿的软件,叫aview,他可以把一张图片转化成文本的图案。于是,就把软件推荐给同事们。gy同学觉得有意思,于是乎回家用脚本和程序也做出了同样的效果。
整好,老王前两周刚刚跟大家讲过图像的处理和文字的识别,于是乎就热炒热卖,用之前的程序,加了几行代码,就做到了同样的效果。先给大家看看结果:
原图:
转换后在shell中的效果:
怎么样,感觉还行吧~
作为程序员,就是有那么一点点的好奇心,想知道怎么弄的嘛?跟老王一起往下看吧~
·主流程
以上就是主流程的代码,比较简单,20行左右。具体操作如下:
1、从工程目录的data下读出文件;
2、为了在shell中输出效果更好,将文件做一次长宽压缩;
3、读出图片每个像素的RGB值;
4、将RGB做灰度处理;
5、将灰度图打印成文字输出。
怎么样,是不是很简单呢?具体的我们往下走:
·读取文件
读文件很简单,只需要用系统的库,把文件读取到内存即可。
·文件长宽压缩
我们把读取的文件,做长宽压缩。我写的函数支持长宽等比压缩。压缩的时候,可以自己通过坐标转换,也可以用系统的函数实现。我这里就图简单,用的系统函数。
·读取像素RGB值
我们将图像的每个像素的RGB值读取出来,放入到二维数组中,方便处理。
·灰度化
接下来,就是将每个像素的RGB值转化为灰度值。灰度值,其实就是把RGB三原色做一个加权,也等同于YUV中的Y通道值。老王在之前的《拍照怎么搜题》中详细讲过怎么样做灰度,如果想详细了解,可以订阅老王的微信:simplemain进行查阅。
·把灰度值打印输出
好了,我们有了灰度值,最后一步,就是把他变成文字打印输出(老王已经迫不及待了……)
我们先定义了一些字符,就是用来显示不同灰度效果的。因为灰度值的范围是[0,255],值越大,则越白越亮;值越小,则越黑越暗。因为我们的shell背景是黑色的,所以,我在定义字符的时候,把看起来比较饱满的字符给了灰度值大的。
然后,我们将灰度值映射到对应的字符上。比如,我们这里一共22个字符,那么每12个灰度值对应一个字符:灰度值[0,11] ->
第一个字符-点号[.];灰度值[12,23]->
第二个字符-逗号 [,];……灰度值[252,255] ->
第22个字符[@]
只要将最后的结果打印输出到shell(或者控制台)就得到我们文章一开始的效果图了,是不是很简单啊,这里老王打印了一些图:
其实懂了这个原理,还可以把视频用文本的方式播放出来。原理就是提取视频每帧的图片,然后用文本绘制。只是在绘制的时候,要注意换行、回退这些问题。
好吧,老王今天就是突发奇想,所以文章很短,就到这儿吧~ ^_^
如果你对只讲技术干货的老王感兴趣,请关注老王的微信公众号:simplemain