undefined
undefined
前几天看到一幅用字符(准确的说是 ascii 码)绘制的 doge 图像,觉得挺有意思
undefined
- <?php /** * :: :: * :;J7, :, ::;7: * ,ivYi, , ;LLLFS: * :iv7Yi :7ri;j5PL
- * ,:ivYLvr ,ivrrirrY2X, * :;r@Wwz.7r: :ivu@kexianli. * :iL7::,:::iiirii:ii;::::,,irvF7rvvLujL7ur
- * ri::,:,::i:iiiiiii:i:irrv177JX7rYXqZEkvv17 * ;i:, , ::::iirrririi:i:::iiir2XXvii;L8OGJr71i
- * :,, ,,: ,::ir@mingyi.irii:i:::j1jri7ZBOS7ivv, * ,::, ::rv77iiiriii:iii:i::,rvLq@huhao.Li
- * ,, ,, ,:ir7ir::,:::i;ir:::i:i::rSGGYri712: * ::: ,v7r:: ::rrv77:, ,,
- ,:i7rrii:::::, ir7ri7Lri * , 2OBBOi,iiir;r:: ,irriiii::,, ,iv7Luur: * ,,
- i78MBBi,:,:::,:, :7FSL: ,iriii:::i::,,:rLqXv:: * : iuMMP: :,:::,:ii;2GY7OBB0viiii:i:iii:i:::iJqL;::
- * , ::::i ,,,,, ::LuBBu BBBBBErii:i:i:i:i:i:i:r77ii * , : , ,,:::rruBZ1MBBqi,
- :,,,:::,::::::iiriri: * , ,,,,::::i: @arqiao. ,:,, ,:::ii;i7: * :, rjujLYLi
- ,,:::::,:::::::::,, ,:i,:,,,,,::i:iii * :: BBBBBBBBB0, ,,::: , ,::::::
- , ,,,, ,,::::::: * i, , ,8BMMBBBBBBi ,,:,, ,,, , , , , , :,::ii::i:: *
- : iZMOMOMBBM2::::::::::,,,, ,,,,,,:,,,::::i:irr:i:::, * i ,,:;u0MBMOG1L:::i::::::
- ,,,::, ,,, ::::::i:i:iirii:i:i: * : ,iuUuuXUkFu7i:iii:i:::, :,:,: ::::::::i:i:::::iirr7iiri::
- * : :rk@Yizero.i:::::, ,:ii:::::::i:::::i::,::::iirrriiiri::, * : 5BMBBBBBBSr:,::rv2kuii:::iii::,:i:,,
- , ,,:,:i@petermu., * , :r50EZ8MBBBBGOBBBZP7::::i::,:::::,: :,:,::i;rrririiii::
- * :jujYY7LS0ujJL7r::,::i::,::::::::::::::iirirrrrrrr:ii: * ,: :@kevensun.:,:,,,::::i:i:::::,,::::::iir;ii;7v77;ii;i,
- * ,,, ,,:,::::::i:iiiii:i::::,, ::::iiiir@xingjief.r;7:i, * , , ,,,:,,::::::::iiiiiiiiii:,:,:::::::::iiir;ri7vL77rrirri::
- * :,, , ::::::::i:::i:::i:i::,,,,,:,::i:i:::iir;@Secbone.ii::: * * * Doge
- bless you! * No bug! * * @Author 燕睿涛<ritoyan@163.com>
- * @Date * @Desc */
undefined
将他放到代码的注释部分,加上了
的字样,放在了代码的注释部分(新建脚本的时候自动添加),同事看到了觉得挺有意思,问我怎么搞得。 后来我仔细看了下这幅图,分析了下,都是用 ascii 字符绘制的,通过 ascii 字符的占用像素多少表现图片的深浅,想通了原理决定自己实现一个图片转字符的工具。
- Doge bless you! No bug!
undefined
undefined
我比较熟悉 php,刚好 php 有 GD 库可以处理图片,简直不要太合适~
undefined
对图片的处理也比较简单,读取图片,灰度处理,获取每个像素点的灰度值,将灰度值的深浅转换为 ascii 字符。
undefined
都去图片之前,首先要做的就是统一接口,实现读取多重类型的图片,php 的 GD 库中,没有直接提供相关的函数,造个小轮子:
undefined
- class ImageCreate {
- // 要处理的目标,可能是文件
- protected $target = "";
- // 文件的类型
- protected $type = 0;
- protected $supportTypes = [1 = >"imagecreatefromgif", // gif
- 2 = >"imagecreatefromjpeg", // jpg
- 3 = >"imagecreatefrompng", // png
- 6 = >"imagecreatefrombmp", // bmp
- ];
- public
- function __construct($target, $type = 0) {
- $this - >target = $target;
- $this - >type = $type;
- }
- public
- function create() {
- $type = $this - >getType();
- if (!isset($this - >supportTypes[$type])) {
- throw Exception("Type of image not support. Abstract[type[{$this->type}]]");
- }
- $func = $this - >supportTypes[$type];
- if (method_exists($this, $func)) {
- $ret = $this - >$func();
- } else {
- $ret = $func($this - >target);
- }
- return $ret;
- }
- protected
- function getType() {
- if (!$this - >type) {
- $this - >type = exif_imagetype($this - >target);
- }
- return $this - >type;
- }
- }
undefined
使用时候不用关心图片类型,类库内部帮你做了处理,
就获取到了图片 resource 句柄,供下一步使用。
- (new ImageCreate($image))->create()
undefined
php 读取像素点信息用下面的公式,其中
,
- $x
分别表示像素点的位置。
- $y
undefined
- $rgb = imagecolorat($this - >resourceImage, $x, $y);
- $r = ($rgb >> 16) & 0xFF;
- $g = ($rgb >> 8) & 0xFF;
- $b = $rgb & 0xFF;
undefined
像素灰度化,关于灰度化可以参考百度百科的解释
undefined
这里使用了加权平均法
undefined
更详细的内容这里就不讨论了,有兴趣的可以自行查阅资料,这里主要使用了
求灰度值
- 加权平均法
undefined
这里插叙下,当我完成开发后,发现,稍微大点的图片,输出信息很容易就换行了,看起来一团糟,这里还要做一个比例缩放的功能,沿着宽高方向做不同的缩放,将多个像素点合并为 1 个,合并的时候简单的取加权平均值。
undefined
- gray = (gray0 + gray1 + ... + grayn) / n;
undefined
undefined
这里开发已经基本完成,已经放到 github,发布到 composer,想看看效果的只需要通过 composer 命令
安装就可。
- composer require aizuyan/img2ascii
undefined
安装完成之后,会有
可执行文件,向下面这样执行他就可以了,第一个命令是要处理的图片,-x 是宽度方向像素缩小比例,-y 是高度方向缩小比例(由于编辑器中 ascii 字符显示的时候一般高度是宽度的两倍,所以缩放的时候刚好反过来)
- vendor/bin/img2ascii
undefined
- ➜bin img2ascii~ / Desktop / abm.jpg - x 10 - y 20 : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::rrii: s: :::::::::::::::::::::::::::::::::::::::::::::::::iisMN8B99r: ::::::::::::::::::::::::::::::::::::::::::::::::iq0B8M0000r: ::::::::::::::::::::::::::::::::::::::::::::::@B8B09BB0@0B: :::::::::::::::::::::::::::::::::::::::::::::r@BBNB08880B0v: :::::::::::::::::::::::::::::::::::::::::::ir000B8NB888@B@Noi: ::::::::::::::::::::::::::::::::::::::::i00000BB8@B@@808BBsni: ::::::::::::::::::::::::::::::::::::::0B@B00no7vr7ii7rntipi: :::::::::::::::::::::::::::::::::::::tBB9mmoi;
- i i ii: ;
- 7s: i: ::::::::::::::::::::::::::::::::::::i000Nnsirvir i isi: ::::::::::::::::::::::::::::::::::::::i0B0nmmtii i rir: ip7: :::::::::::::::::::::::::::::::::::::7in8npstrpsrqpiisqtorr: ::::::::::::::::::::::::::::::::::::vvp9mtvppoqirs;
- i7ovivi: ::::::::::::::::::::::::::::::::::::orq0ttr irr7;
- ii: rvi: :::::::::::::::::::::::::::::::::::::ivr9tmi;
- i7oitr iitqvi: :::::::::::::::::::::::::::::::::::::::imnpsrt7soprri7isqr: ::::::::::::::::::::::::::::::::::::::::n9tsisqi: i: rvr7: :::::::::::::::::::::::::::::::::::::::::qq9tr7iompvvoi7i: ::::::::::::::::::::::::::::::::::::::::::ioipmmqpiiiiri: :::::::::::::::::::::::::::::::::::::::::i rrvrirsrnr7viir7ii: ::::::::::::::::::::::::::::::,
- ,
- .iv: ;
- riiiviirorrtrviirii,
- ,
- ,
- :::::::::::::::::::::::ii.iiii7iiiriri77r7ivri;
- i;: .,
- ..r: ::::::::::::::::iri vv...: rr7;
- i: iiii: iiiviirir,
- ...v;: i: ::::::::i: iv;: rr....i i rr: :;
- i r: r riiii: ....: rr;
- i;: :::::v7v: ::r....: riiiiviiiiii: ::iii....r: ir: i ri: :::smtqiirr: ........,
- iii;
- r;
- iiriii: ...: iriv;
- irii: ::rmppir r;
- ri.,
- ......,
- ,
- ,
- .....,
- ,
- 7i;
- ir irr: :instiv: r.i: ,
- ,
- ,
- ,
- .......,
- .rrvi: i vr: :smNniv isp rq77i: ::,
- ,
- ::,
- ::,
- ,
- ,
- ,
- iipsr.viv;
- ii r7;:
undefined
下面是几张转换先后图片的效果。
undefined
- n00nnNM8@8M99@B8088B8B0NsnMMMmm00@8B8B@BB0M9MmmmN080Nn9MB00@@B08noonmmm 9snM90NM@B900089B08B@B8rtnn0NMnm99M9nN0N0NN0nNmmN@0B8N990@000sqtssooots M8B9n889M@80M08npm0NMmttiiii: ii: ,
- :i i i7mM08MM09MnpstpsspoqqnN m00NN0pmnM0pttonmq7: ......,
- ,
- ,
- ,
- :i iss90morttqoom9N9nr tmnnsN7qoNBMmovi,
- .......,
- i: ::::::,
- ,
- :iirpopnMBN9Mnnnn ms99p7iqNNnqr: ...............iir iiiii: i: ::,
- ,
- ir7mmnrnnmmMM 9M000mmmnq: ............,
- :smvii;
- iirrrviiiii: irrirm8B 0BB00@Bmr..............,
- :i7s: v7i7rrivri77ri;
- i,
- ,
- ,
- iip 8B00B08s.........,
- ,
- ,
- :ir7iivqpqqor7ivv7ir: ::::i B8B8B0s.............,
- ,
- ,
- ,
- :iiotistpttsrrqssii: :i i i 0BBBBo.,
- ..........,
- ,
- ,
- ,
- i oooorstnsoprosoviivir7: rv 8@8Mi,
- .......,
- ,
- ,
- ,
- ,
- :iqsrtnqotppsmsoporpttrpqtq MMm..,
- ........,
- ,
- ,
- ,
- ii imnmnnmrrsmnnmmmmmmmmmmrnB Mmr..,
- .....,
- ,
- ,
- ,
- ,
- ,
- ,
- ....iii7n9nmtnrnmnnm9M9909MNm90BB mp: ..,
- ..,
- ,
- ,
- ,
- ,
- ,
- :,
- ,
- ,
- ,
- :ivtMM9nnnmnnm00000N09099888@0p,
- ..,
- :,
- ,
- ,
- ,
- ,
- ,
- i i: :::::::ivtM00NNnmMM90N9N0N9NMB@B@00 Ns.,
- ::isri,
- ,
- :rr7irriivi: irri iroM0MN9N0NN9000009N98@8@0B@0mi: iii: ivr: ,
- ....ivvi: :istos7iri irq0088008088NMMMM9M8@80880@MNpi: iri: i: :....iii i i: ::iis0000090@000M0nN08B0B0@808 09MN7: ;
- 7,
- ,
- ..,
- ,
- :::::::::rqn@B@80NN90nttq000B800080B N0M0M7rri: ..: i: ivir,
- ,
- ,
- ,
- ,
- ,
- ,
- :::,
- ,
- :::irtnM8009ti7iiis0B8B@8BB0@B NN0MN99mm: :nmnssnnnrr: ,
- ,
- ,
- :,
- ,
- ,
- :::i iivivi: ;
- iririsNB@008B0BB NMN0mmrtp i@B@8BB9Npr: ,
- ,
- ,
- :::::ii i: rr iiirr0nn@@B0@0M 9mmmpt7i: .p80B@Nnqi: ,
- ,
- ,
- ,
- ,
- ::::::::::ii ii ii: i;
- iiiirsmm00nmMMm0 09mmmnti,
- oN0@Nmsii: ::::,
- :::::ii ii i i: iiiiririrtmmnnnnssnN N9N0Mrqq: ,
- rpmpopoi: ::::::::::::iiiiiii: :ir: ri irvv7tnnn09oq7i 0NMNn99rr: riqssrpsrr: :::::::iii ii r iir: ;
- iri: iv7ipn99opsi B@Mm9990mi: iiiiriiviii;
- ii iii: ii: irri r ir rr: :riri: ri: :iiiiioiii7 qssptrn9nnnnosir: iiiiii: ::ri rii r: ii: riii ii ir: iiirvvrirvi: ;: r;: i: ri r: i rii: r: iir ri: ;
- iriri ii i rrr;;: :riii rvriivri7rviviviiiiiv;
- ir: i: :::ir: rr i ii i ii: i;;;
- i: ;
- i i;
- ii7iiiriiiviiiiii7ii ii: rir i iiiiii ii i ii iiiii r r: iv: i iviiiiiiirrviiii t v;
- rr: i i i iiii iii i i iiir: ;;
- iir
undefined
再来张美女图片(不知道有没有侵权,侵权删)
undefined
- : iiii: iiiiiqsmM9M@9qtossrntNMmnnM900B@BBB0@8BB@0@BMprpontpp: i r: iirrrm0@8NMBnttptponm0Mnmmnn@B880@@888BB8BBB8nsqorpor: ri: i r: iiiisqnmno9mopsqsqonnnnnnmN8088808B8B@B080B8svi7tsqs iii ii ir: ;
- 7tmnMMmMmotr7rvrmM0B88Mn9B8B@88@8@B@8B@B8tppsnnmr i iii: rirqspmrrmntqppptoNnM9ioqnN08B0888BBB08B0MNsiiiirr7: :::::i i: isnMM0n9nstipM0BMri,
- ,
- rNB000B88@080B@ppsrorqo: :::::iii ittqrtnnstpBB8ni,
- ...,
- ,
- i9880800080nmmiriivrii: i: vnn00mMnptM808i,
- ..,
- :t9NMB0000BB80prvrv7sv,
- ,
- ,
- ,
- :i i irqsotqnps80Bq,
- ,
- ,
- ,
- ::::iiM000088BN0mntv7i7vri,
- ,
- ,
- ::::imn0Mmmtsnrrn7,
- r,
- vii8NN8B88808NMiiivivrr,
- ,
- ,
- ,
- ,
- ::::iv7orqrNstr i,
- .,
- :09B000809MMNr77i7iii,
- ,
- ,
- :::7nmn9rnmqoqi,
- ,
- ,
- ...,
- :.i888@0@0B00mnri;
- rr;
- 7i,
- ,
- ,
- ::iiooqn0rm0Mii: ,
- ,
- ,
- ..,
- ,
- ::t00@0N0080NMNpiivii v,
- ,
- ,
- ::vnmn9snmpm98Mmri,
- ,
- .: iM00BBB88B0ntpv ir: r,
- ,
- ,
- :::rrpsopmMpM0@08ri7;: ..vB9nm0BN808M0mmtvivivi: ::mnmntm9rsq0r;: :iii;
- rtB80B0npm88B8mrooi;: rr,
- iiitpomNni....rv8000900B0N8000009svi: ;
- ivr,
- ,
- ,
- ,
- rmmmmqnmm0N: ...,
- :008MmB8B0N88Mmrporv;
- r: rr;,
- ,
- ,
- iiqtsppmt;: ....,
- ,
- iqnp008008800mmqi;;
- vi,
- ,
- :qnii,
- ..,
- ,
- ,
- ,
- ,
- ,
- ....,
- :rr9B00nimNnmrtsiiiii r...ri.....,
- ,
- ...,
- ,
- 7n08BMi Bmmprvrr: ;
- i;...,
- ,
- p,
- ,
- .......,
- ....irinB0Bsio09Nmpii;;;
- ir.....,
- ,
- mi,
- .....,
- .....: n9rvq@8pimtsrr r: :::i.....,
- ,
- ,
- ,
- tpi,
- ,
- ............i0,
- p@nn00Mntviirir....,
- ,
- in0ni,
- ,
- .....,
- ,
- ..,
- .ii: :vm8nsrii r;: v....,
- rtmmi,
- ,
- ............,
- 7Bnmp7v: iir....,
- ,
- mMM9m i: ......,
- ..,
- .....snoii r: r.......,
- iimnmmq,
- ...,
- .....,
- rnrrii: ::i: ...,
- ,
- ,
- m00Mm0i: :i: ,
- ,
- ....,
- ,
- ....,
- qmmt7i rri...,
- ,
- ,
- ip999n90i,
- :,
- ,
- ,
- ,
- ..........imqp7;
- ir: ir......,
- iq990n99r,
- ...: ..,
- ..0imMmsirvit7.....,
- ,
- ,
- ipN0M0900i..,
- i: ,
- ...7v: iii rr rvi...p0M9mMN09..,
- ,
- ::,
- ,
- ,
- ,
- ,
- ,
- ..ii,
- rBMoq7ivtr......,
- ,
- ,
- s08009@0No,
- ....,
- ,
- :::.,
- i: ,
- :rir: ;
- ivi....,
- ,
- ipNMNn0M9N9.....,
- ,
- ...i: mviir: ir......,
- ,
- ,
- ir0NM9N@@88i........: 7iir ii: ....,
- in99n9NN09v........: i,
- ,
- ,
- pii rivr..,
- ,
- ioBB80M0@BN,
- ........,
- i,
- io7iiiiii...,
- ,
- iNNMnNMNN: ..........,
- ,
- isrr;
- iri.....,
- t088N08B;...........,
- :tmrq7iro7....,
- ,
- v9NNMMBn,
- .............,
- ..,
- :oi: ;
- riv: ....,
- ii000999,
- .......,
- ..immssvqvpi....,
- ,
- :i009N9M,
- ..........,
- ,
- ,
- rq7: irioi....,
- ,
- :iN9NN9r........,
- ,
- sm9priirri....,
- v80B0v..........,
- r7v: ririqi....,
- ,
- ,
- ,
- r0MM7,
- ........: ::::,
- 7oprsviir.....,
- ,
- ,
- :00B......,
- ,
- .,
- ,
- iiir iirii,
- ....,
- ,
- ,
- ,
- ::09i,
- ,
- .....: ,
- ,
- ,
- ,
- ,
- ::irri;
- r: ,
- ,
- ..,
- qs.....,
- :::::::iivi7p7,
- ,
- ,
- .,
- Nr.....,
- ::::::,
- .,
- vi: iir ii,
- ,
- ,
- ,
- ,
- ,
- :0i,
- ......,
- :::::::...,
- :t7v7irsp7,
- ,
- ,
- ,
- :rmv......,
- ,
- ,
- ,
- ,
- ,
- ......po7rriior,
- ,
- ,
- ,
- ::ir,
- ........rnppptspr,
- ,
- ,
- ,
- ::::i.,
- .................iiirivsq
undefined
是不是还挺有意思的
下面是 github 地址 [github-img2ascii][]
composer 地址 [composer-img2ascii][]
来源: http://www.cnblogs.com/iforever/p/6132609.html