打dota满员了没进去,正好也是闲着,就写一写这个吧。
用php转化图片为ascii字符画。
目前ascii字符画我只明白灰度的原理,对于彩色字符画不懂。
那种只用了一个字符靠颜色不同而生成的字符画我觉得不应该叫做ascii字符画。
那种原理更加的简单,读取一个像素点的颜色然后输出 <font color=#******>字符</font>就ok了,
但这种的弊端就是html文件十分大,如果一副200*120的绚丽色彩图片html能达到8mb。
解决的办法就是降低色彩的位数。这个图出了显示技术外,我觉得没有什么实际用处。
下面介绍ascii字符画,ascii字符画就是用ascii字符(asdfgh!@¥什么的都是ascii字符)来表示不同的灰度,
此技术的难点是ascii字符灰度表,灰度表的好坏决定了图片的好坏。
计算ascii字符的灰度并不是只计算改ascii字符所占的像素。
因为在10号字很多ascii所占像素值是相同的,还有有些字符即使占得像素很多但是他留白的地方也很多。
8和H的像素一样多 可能h还有多一些,但是在远处看 8组成的画要比 H组成的更黑一些。
我自己计算了3个灰度表感觉都不是很理想,经过多方面查找找到了一个比较不错的灰度表。
色阶是63bit的,已经足够了。
我自己做了个24bit感觉很缺颜色,只是表现出大体的,具体细节都丢失了。
63bit的ascii灰度表我只有php的了,在网上找的那个被我删了。。。。
- $gray = array(
- '0' => '64' , //前面为灰度值 0是黑色 62是白色 后面为字符的ascii码
- '1' => '35' ,
- '2' => '36' ,
- '3' => '37' ,
- '4' => '38' ,
- '5' => '56' ,
- '6' => '66' ,
- '7' => '77' ,
- '8' => '87' ,
- '9' => '42' ,
- '10' => '109' ,
- '11' => '119' ,
- '12' => '113' ,
- '13' => '112' ,
- '14' => '100' ,
- '15' => '98' ,
- '16' => '107' ,
- '17' => '104' ,
- '18' => '97' ,
- '19' => '111' ,
- '20' => '81' ,
- '21' => '48' ,
- '22' => '79' ,
- '23' => '90' ,
- '24' => '88' ,
- '25' => '89' ,
- '26' => '85' ,
- '27' => '74' ,
- '28' => '67' ,
- '29' => '76' ,
- '30' => '116' ,
- '31' => '102' ,
- '32' => '106' ,
- '33' => '122' ,
- '34' => '120' ,
- '35' => '110' ,
- '36' => '117' ,
- '37' => '118' ,
- '38' => '99' ,
- '39' => '114' ,
- '40' => '91' ,
- '41' => '93' ,
- '42' => '123' ,
- '43' => '125' ,
- '44' => '49' ,
- '45' => '40' ,
- '46' => '41' ,
- '47' => '124' ,
- '48' => '47' ,
- '49' => '63' ,
- '50' => '73' ,
- '51' => '108' ,
- '52' => '33' ,
- '53' => '105' ,
- '54' => '62' ,
- '55' => '60' ,
- '56' => '43' ,
- '57' => '95' ,
- '58' => '126' ,
- '59' => '45' ,
- '60' => '59' ,
- '61' => '44' ,
- '62' => '46' ,
- );
灰度表完成了 就可以把图片转换成ascii字符画了。
大致原理是 ,读出每一个像素的颜色信息 。(先计算长和高,然后for语句)
读像素的颜色我用的是php的gd库
- $colorIndex = imagecolorat($img,$xx,$yy);
- $color = imagecolorsforindex($img,$colorIndex);
不过这个信息rgb是分开的,而灰度的rgb的值是相同的。
就需要转换了。在网上找到的公式 $gray = 0.3*$color[red] + 0.59*$color[green] + 0.11*$color[blue];
灰度是256bit的,而我们只有63bit 那么做个简单的加减法运算就可以了。
最后echo一下字符就ok了。
本人才疏学浅,程序就不放了,免得被人笑话。
我相信你们写这个程序也就几分钟而已 。^_^
继续dota了,上一篇日志是做完的视频。
我的word都毁了 word2007打开txt 在存成docx有bug 空格自动没了。。。倒是字符画参差不齐。。。
最后提醒一句字体要用等距的 比如宋体
ps 自己感觉程序执行时间还可以,一张150.*120的图片 0.759s
717张用时250多s











