往事依依,随风而行。淡忘过去的一切,在风中迎接新的希望。

【PHP】php转化图片为ascii字符画

打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的了,在网上找的那个被我删了。。。。

PHP代码
  1. $gray = array(  
  2. '0' => '64' ,  //前面为灰度值 0是黑色 62是白色   后面为字符的ascii码
  3. '1' => '35' ,  
  4. '2' => '36' ,  
  5. '3' => '37' ,  
  6. '4' => '38' ,  
  7. '5' => '56' ,  
  8. '6' => '66' ,  
  9. '7' => '77' ,  
  10. '8' => '87' ,  
  11. '9' => '42' ,  
  12. '10' => '109' ,  
  13. '11' => '119' ,  
  14. '12' => '113' ,  
  15. '13' => '112' ,  
  16. '14' => '100' ,  
  17. '15' => '98' ,  
  18. '16' => '107' ,  
  19. '17' => '104' ,  
  20. '18' => '97' ,  
  21. '19' => '111' ,  
  22. '20' => '81' ,  
  23. '21' => '48' ,  
  24. '22' => '79' ,  
  25. '23' => '90' ,  
  26. '24' => '88' ,  
  27. '25' => '89' ,  
  28. '26' => '85' ,  
  29. '27' => '74' ,  
  30. '28' => '67' ,  
  31. '29' => '76' ,  
  32. '30' => '116' ,  
  33. '31' => '102' ,  
  34. '32' => '106' ,  
  35. '33' => '122' ,  
  36. '34' => '120' ,  
  37. '35' => '110' ,  
  38. '36' => '117' ,  
  39. '37' => '118' ,  
  40. '38' => '99' ,  
  41. '39' => '114' ,  
  42. '40' => '91' ,  
  43. '41' => '93' ,  
  44. '42' => '123' ,  
  45. '43' => '125' ,  
  46. '44' => '49' ,  
  47. '45' => '40' ,  
  48. '46' => '41' ,  
  49. '47' => '124' ,  
  50. '48' => '47' ,  
  51. '49' => '63' ,  
  52. '50' => '73' ,  
  53. '51' => '108' ,  
  54. '52' => '33' ,  
  55. '53' => '105' ,  
  56. '54' => '62' ,  
  57. '55' => '60' ,  
  58. '56' => '43' ,  
  59. '57' => '95' ,  
  60. '58' => '126' ,  
  61. '59' => '45' ,  
  62. '60' => '59' ,  
  63. '61' => '44' ,  
  64. '62' => '46' ,  
  65.   
  66. );  

灰度表完成了 就可以把图片转换成ascii字符画了。

大致原理是 ,读出每一个像素的颜色信息 。(先计算长和高,然后for语句)
读像素的颜色我用的是php的gd库

PHP代码
  1. $colorIndex = imagecolorat($img,$xx,$yy);  
  2. $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

Tags: php, 字符画, 技术

« 上一篇 | 下一篇 »

发表评论

评论内容 (必填):