在刷头条的时候,看到这样一张图片,顺手存了下来。
现在用JS来实现一下。
- 功能:将图片变为用字符组成的画
- 工具:canvas
- 难度等级: ★
- 项目地址: https://github.com/zj-john/imageToCodeEffect
先上最终工具的地址,有兴趣的可以操作下。
编码之前
目标:
上传一张图片,导出为图片对应的字符画。如果上传的图片过大,有可能导致生成的字符画过大,难以看到效果,所以还需要对上传的图片调整大小。
分析:
基本的想法是获取图片的每一个像素点,然后转换每个像素点,对应一个字符。
canvas中处理的图片像素包括R,G,B,A四个点,也就是说每一个图片的像素点对应canvas解析结果中的四个值,分别是R(red值),G(green值),B(blue值),A(Alpha透明度值)
拿上图来看,字符画是没有颜色概念的,我们实际处理的是一张灰度图像。所以需要转换rgb图像到灰度图像。
常用的RGB转灰度的算法,参考:
1234567891011// 方法1 心理学公式Gray = R*0.299 + G*0.587 + B*0.114// 方法2Gray = (R*299 + G*587 + B*114 + 500) / 1000Gray = (R*30 + G*59 + B*11 + 50) / 100// 方法3 更快,调节各系数可以调节精度Gray = (R*19595 + G*38469 + B*7472) >> 16// 方法4 Adobe Photoshop中公式,效果好,慢Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)// 方法5 精度最低 效果不好GRAY = (R + G + B)/3灰度图像中每个像素点只包括RGBA中的A值,我们把A值(0~255)用我们要替代的字符划分区间后,落在区间中的像素值用对应的字符替换,就替换为了字符图。
从上图中,我们看到很重要的部分在于留白,特别是背景的部分。所以对于灰度值最高的像素区间(灰度值最高为255,代表白色),我们用空白(空格)替换。
编码
上传图片
|
|
RGB图转灰度图
|
|
把图片转为字符图
|
|
后续
- 可填写用于填充的字符
- 有一些色彩比较丰富的图片,增强对比度后再处理
- UI
- 彩色字符图案