图片,还可以这样玩儿

前几天,我在装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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值