1

引言

前几天看到一幅用字符(准确的说是ascii码)绘制的doge图像,觉得挺有意思

<?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
 */

将他放到代码的注释部分,加上了Doge bless you! No bug!的字样,放在了代码的注释部分(新建脚本的时候自动添加),同事看到了觉得挺有意思,问我怎么搞得。
后来我仔细看了下这幅图,分析了下,都是用ascii字符绘制的,通过ascii字符的占用像素多少表现图片的深浅,想通了原理决定自己实现一个图片转字符的工具。

处理图片

我比较熟悉php,刚好php有GD库可以处理图片,简直不要太合适~

对图片的处理也比较简单,读取图片,灰度处理,获取每个像素点的灰度值,将灰度值的深浅转换为ascii字符。

都去图片之前,首先要做的就是统一接口,实现读取多重类型的图片,php的GD库中,没有直接提供相关的函数,造个小轮子:

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;
    }
}

使用时候不用关心图片类型,类库内部帮你做了处理,(new ImageCreate($image))->create()就获取到了图片resource句柄,供下一步使用。

php读取像素点信息用下面的公式,其中$x,$y分别表示像素点的位置。

$rgb = imagecolorat($this->resourceImage, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

像素灰度化,关于灰度化可以参考百度百科的解释

灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有以下四种方法对彩色图像进行灰度化。

一般有以下四种方法对彩色图像进行灰度化处理:分量法 最大值法平均值法加权平均法

这里使用了加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

处理公式 intval($r 0.228 + $g 0.587 + $b * 0.114)

更详细的内容这里就不讨论了,有兴趣的可以自行查阅资料,这里主要使用了加权平均法求灰度值

这里插叙下,当我完成开发后,发现,稍微大点的图片,输出信息很容易就换行了,看起来一团糟,这里还要做一个比例缩放的功能,沿着宽高方向做不同的缩放,将多个像素点合并为1个,合并的时候简单的取加权平均值。

gray = (gray0 + gray1 + ... + grayn)/n;

使用

这里开发已经基本完成,已经放到github,发布到composer,想看看效果的只需要通过composer命令composer require aizuyan/img2ascii安装就可。

安装完成之后,会有vendor/bin/img2ascii可执行文件,向下面这样执行他就可以了,第一个命令是要处理的图片,-x是宽度方向像素缩小比例,-y是高度方向缩小比例(由于编辑器中ascii字符显示的时候一般高度是宽度的两倍,所以缩放的时候刚好反过来)

➜  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;:

下面是几张转换先后图片的效果。

图片描述

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 

再来张美女图片(不知道有没有侵权,侵权删)

图片描述

: 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

是不是还挺有意思的,下面是


燕南飞Liam
852 声望294 粉丝

微博 : [链接]