图片算法

伟洪winni 2017-11-13 08:45:51
想要的效果图: http://www.degraeve.com/img2txt-yay.php?url=http%3A%2F%2Fimages2015.cnblogs.com%2Fblog%2F763758%2F201606%2F763758-20160612082543871-1901077809.png&mode=A&size=100&charstr=ABCDEFGHIJKLMNOPQRSTUVWXYZ&order=O&invert=N

尽量接近效果图的结果, 字符排列整齐, 效果逼真


<?php
function tochars($r, $g, $b, $px = 256, $char = "#ABCDEFGHIJKLMNOPQRSTUVWXYZ@$%??__ff--++~~'' ::.. `` ")
{
if ($px == 0)
return '';
$len = mb_strlen($char);
//灰度值
$gray = floor(($r + $g + $b) / 3);
//将256个像素平均分配给字符
$unit = ceil($px / $len);
//获取当前像素对应的字符
$index = floor($gray / $unit);
if ($index >= $len) {
$index = $len - 1;
}
return $char[(int)$index];
}

//缩小图片
function tosmallim($const = 100, $width, $height, $image)
{
if ($width > $const) {
$times = floor($width / $const);
$smwidth = $const;
$smheight = floor($height / $times);
$im = imagecreatetruecolor($smwidth, $smheight);
imagecopyresampled($im, $image, 0, 0, 0, 0, $smwidth, $smheight, $width, $height);
return [$im, $smwidth, $smheight];
}
return [$image, $width, $height];
}


$imname = 'http://images2015.cnblogs.com/blog/763758/201606/763758-20160612082543871-1901077809.png';

$image = ImageCreateFromPng($imname);

$size = getimagesize($imname);
$width = $size[0];
$height = $size[1];

list($image, $width, $height) = tosmallim(100, $width, $height, $image);


$arr = [];
for ($i = 0; $i < $height; $i++) {
for ($j = 0; $j < $width; $j++) {
$rgb = ImageColorat($image, $j, $i);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$arr[] = floor(($r + $g + $b) / 3);
}
}
$num = count(array_unique($arr));
$str = '<span style="font-size: 8pt;
letter-spacing: 4px;
line-height: 8pt;
font-weight: bold;display: block;
font-family: monospace;
white-space: pre;
margin: 1em 0;">';
for ($i = 0; $i < $height; $i++) {
for ($j = 0; $j < $width; $j++) {
$rgb = ImageColorat($image, $j, $i);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$str .= tochars($r, $g, $b, $num);
}
$str .= '<br>';
}
echo $str . '</span>';
...全文
668 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2017-11-15
  • 打赏
  • 举报
回复
$ascii = ' 0011223344';//两个级别用一个字符表示
                                                                                         
                   123220                                                                
                 034444442                                                               
                04444444443                  0                                           
       0 00  00 444444444442                                                             
       00000   14444444444440     12331                                                  
       0110    24444443344441   134444430                                       02       
        011    24444211013441  0244444443                      1212342           0       
         00    14441111111441  23344444442                   2444444441                  
          00   0444333333344   24333321124                 0444444444443                 
           000  244300220142   14301100110                03444444444443                 
            000002311111111     320110010                 244444444444441                
             0144221000000      110011110    24400444 240 244444444444442                
              44444200 000      010000000    244224442340 044434444333340                
              244444203131       11000000    244444444440  23111112111240                
               144444424441      2210010      0000001110    111110111120                 
                034444444441    133 00420        0000110    110011000000                 
                 144444444442  2234 204321     001100120    110000000010                 
                 24444444444422223413143221  01000   00000011110   000                   
                 244444444444432223232322221 00        023332222101120                   
                 34444444444444322233332212210          133322222222231                  
                 34444444444443122234422200220           233222222222221                 
                 3444444444343012222332220 01            0233222222222221                
                 444444444430  12222232220  00            0232210122212221               
                 44444444442   122222222210001             2322022220222221              
                 44444444443   1222222222111130            23320122202222222        0    
                 44444444444   12222222221   241           1331101000222222220      0    
                044444444444   22222222221   244420        1332222222222222222           
                 34444444441   03333333320   244444420     2332222222222222222           
                 24444444441   02222222341   2444444442   033332222222222022210          
           0     24444444441   0234433443    44444444442  1333322222222220 20000         
                 244200  341   0223444441   244444444444 03333322222222330   00          
                 2442    342   02223344421134444444444440 344444444444443                
                 2442    342   0222223444444444444444443  344444444444444                
                 2441    342   0222222444444444444444441  444444444444444                
                 2441    242   022222234444444444444443   4444444444444440               
                 2441    242   12222222344444444444443    4444444444444440       0       
                 2441    242   12222222223444444444430   24444444444444442       0       
               014441000024420034332223441244444443100002444444444444444442              
        0000000022220000012220222222122222000122100000012222222222222222222000000        
               00000000000000000000000000000000000000000000000000000000000               
                                                                                         
xuzuning 2017-11-15
  • 打赏
  • 举报
回复
$ascii = ' 012345678';
                                                                                         
                   145530                                                                
                 078888885                                                               
                18888888887                  0                                           
       1 00  00 788888888885                                                             
       00010   18888888888880     24553                                                  
       0221    48888887688882   278888870                                       03       
        121    48887521127883  0488888887                      2324585           0       
         01    38873322222882  45788888884                   4788888882                  
           1   0888666666688   38667643247                 0778888888885                 
           010  488601440284   28511111120                06888888888886                 
            011005632222223     641121120                 588888888888883                
             0278542111111      321121120    47710777 370 488888888888883                
              78888311 010      021111110    488558874680 087877878665781                
              488888415262       21100010    488888888880  45223334221380                
               188888747883      3311021      0000002210    232221223340                 
                078888888883    265 10750        0111121    211111111110                 
                 388888888883  3467 518641     012311231    210000000110                 
                 48888888888843545716375452  01100   01111112310    10                   
                 488888888888875456465654543 01        045555443212341                   
                 58888888888888645467755434530          355554554455552                  
                 68888888888885245467745401540           455544455444552                 
                 7888888888777124545664540 03            0555545445444542                
                 788888888860  14545554541  10            1555421254435443               
                 88888888885   245454545410111             4553044551444443              
                 88888888886   2454545454312261            45531233314454443        0    
                 88888888888   34545454542   483           355221200044444444       0    
                088888888887   34545454542   488741        3555445444445544444           
                 57777777772   16666666630   488888740     4555555544554544444           
                 47777777772   05555455672   4887777883   055555445444445034421          
           1     47777777773   0567766786    78887888883  3555555555555550 31110         
                 477400  773   0557888872   588888888887 06555555555555560   11          
                 4773    673   15456678752368888888888880 588887777888886                
                 4773    673   1545545888888888888888886  688888888888887                
                 4773    574   1545545788888888888777782  788888888888888                
                 4773    574   154554557877788888887785   8888888888888880               
                 4773    474   15455455588888888888886    8888888888888880       1       
                 4772    475   25455455447888888888850   38888888888888884       1       
                28873000037840168655456882478888886200005888888888888888883              
         00000004444100001444134444324444400133320000002333333333333334444400000         
                000000000000000000000000000000000000000000000000000000000                
                                                                                         
xuzuning 2017-11-15
  • 打赏
  • 举报
回复
那你就多选几种字符组合就是了,虽然是按灰度分级,但也不必严格按灰度分布 只不过是某个字符代表某级灰度而已 比如我的代码中 $ascii = " ABCDEFGHIJK#";
                                                                                         
                   BFHGEA                                                                
                 AJ######G                                                               
                A#########J                                                              
       B A   A  J##########G                                                             
       A ABA   C############      CFHGD                                                  
        CDB    F######JH####C   CIKKKKKIA                                        E       
        ACB    F###JGDBBCI##E   FKKKKKKKJ                      DEDFHKG           A       
         AA    D##KDDCCCCC##C  EHJKKKKKKKF                   FKKKKKKKKC                  
           B    ##KHIIIIII##   EKIIIHFDCEK                 AJKKKKKKKKKKH                 
            BA  F##IABFFAD#F   CKGBBBBBBCA                AIKKKKKKKKKKKH                 
             BB  GIDDDDDDDD     IFBBDBBDA                 GKKKKKKKKKKKKKD                
             ACJ#GFDBBBBBB      DCBBCCBCA    EJJBAJJJ EJA FKKKKKKKKKKKKKE                
              J####EBA ABA      ACBBBBBBA    FKKGGKKKFIKA A#JKJJKJKIIHIKB                
              F####KEBHCHC       CBB  AB     FKKKKKKKKKKA  FHDCDEDFCCBE#                 
               BK####JGJ##D      EEBBADB           ACCB     CEDDDBDCDEFA                 
                 J#########E    DIH BAJGA         BBBBCA    CCBBBCBBBBB                  
                 D##########E  EFIK GAKHFB      BDDBBCEB    CBAAAAAAABCA                 
                 E###########FEGFHKBHDKGFGC  ABBA     BBBBBBCEB     AA                   
                 F############JGFGIFIGIGFGGD AB        AFGGGGGGECACEGB                   
                 G#############HFGGIJJHGFDGGDA          DGGGGGGGGFGGGGC                  
                 H############HCFGFIJJFGFABGGA           GGGGGGGGGGGGGGC                 
                 I#########JKIBDFGFGIIFGFA AD            AGGGGGGGGGGGGGGD                
                 J#########I   BFGFGGHFGFA  B             BGGGFCBDGGFEGGFD               
                 K#########G   CFGFGFGFGFBABBB             FGGEAFGGGBFGGFFE              
                 ##########I   DFGFGFGFGFDBCCHB            EGGEBCEEEBFGGGFFE        A    
                 ##########K   DFGFGFGFGFC   F#E           DGGCCBDAA FGGGFFFE            
                A##########J   EFGFGFGFGFC   FK#KFA        EGGGGFGFGFGGGGFFFFF           
                 HJJJJJJJJJD   BIIIIIIIIE    FKKKKKJF      FGGGGGGGGGGGGGEFFFF           
                 FJJJJJJJJJD   AGGGGGGGIJC   FKKJJJKKKE    GGGGGGGGGGGGGGAEFFCB          
           B     FJJJJJJJJJD   AGHJJIIJKI    JKKKKKKKKKE  EGGGGGGGGGGGGGGA EBBB          
                 FJJF    JJE   AGGJKKKKJD   GKKKKKKKKKKJ AIHGGGGGGGGGGGHHA   AB          
                 FJJE    IJE   AGGGHIJKKGCEIKKKKKKKKKKKK  H##KKKJJKKK###I                
                 FJJE    HJE   BGGGGGHKKKKKKKKKKKKKKKKKI  I#############K                
                 FJJE    HJF   BGGGGGGJKKKKKKKKKKKJJJKKC  K##############                
                 FJJD    GJF   BGGGGGGHKKKJJKKKKKKKKKKG   ###############                
                 FJJD    FJF   BGGGGGGGHKKKKKKKKKKKKKI    ###############A       B       
                 FJJD    EJG   CGGGGGGGGFJKKKKKKKKKKG    EKK###########KKE       A       
                CKKJD    EK#F AIKIHGGGIKKCEJKKKKKKHC    GKKKKKKKKKKKKKKKKKE              
                EFFFB    BFFFBEFFFFEDEFFFFA BDEEDA     CEEEEEEEEEEEEEEEEEEEA             
                                                                                         
                                                                                         
伟洪winni 2017-11-15
  • 打赏
  • 举报
回复
引用 4 楼 xuzuning 的回复:


第一次试的时候,我去掉所有亮度相同的字符(每个亮度的字符保留一个)用来填充图片
第二次试的时候,我挑选了8个字符亮度差比较大的来填充图片
两次效果都不好

参考了下这两篇资料
https://www.cnblogs.com/jelly7723/p/5657891.html
https://segmentfault.com/a/1190000007692741

图片装灰度值的计算可能需要换下

这个网站的算法太厉害了,排列整齐, 看起来舒服
http://www.degraeve.com/img2txt-yay.php?url=http%3A%2F%2Fimages2015.cnblogs.com%2Fblog%2F763758%2F201606%2F763758-20160612082543871-1901077809.png&mode=A&size=100&charstr=ABCDEFGHIJKLMNOPQRSTUVWXYZ&order=O&invert=N
xuzuning 2017-11-14
  • 打赏
  • 举报
回复
$imname = 'http://images2015.cnblogs.com/blog/763758/201606/763758-20160612082543871-1901077809.png';
$im = imagecreatefromstring(file_get_contents($imname)); //加载图片
imagefilter($im, IMG_FILTER_GRAYSCALE); //转换成灰度图片

$dm = imagecreatetruecolor(imagesx($im)/10,imagesy($im)/10); //适当的缩小
imagecopyresampled($dm, $im, 0,0,0,0,imagesx($dm),imagesy($dm),imagesx($im),imagesy($im));//导入原图

ascii($dm); //产生字符画
//png($dm);

function png($im) {
  header("Content-type: image/png");
  imagepng($im);
}
function ascii($im) {
  $ascii = " .`:-,;\"_~!^ir |/I=<>*l1t+j?v\)(Lf{7}JTcxz][unsYoFye2aVk3hZC4P5AqXpE%0Udb6KS9#HwG\$OgD8RQmB&NWM@";
  $k = round(256/strlen($ascii),1);
  $ascii = str_split($ascii);
  echo '<xmp>';
  for($y=0;$y<imagesy($im);$y++) {
    for($x=0; $x<imagesx($im); $x++) {
      $c = floor((256 - (imagecolorat($im,$x,$y) & 0xff))/ $k);
      echo $ascii[$c];  
    }
    echo PHP_EOL;
  }
  echo '</xmp>';
}
                                               `                                         
                  .+e5C[r       ::             ,                                         
                 I9@@@@@MZ,     `-         `,`:`                                         
       ` ``  .  =B@@@@@@@@S,                ;~-                                          
       *-r^`  r.w@@@@@@@@@@3                -.                                           
       /~ l|   ?@@@@@@@@@@@M!    `v25CT,    .                                            
       ~(7t`   o@@@@@WSqN@@@f   \KDDDDDK|                           :           ^]       
        <fj`   e@@@w37jtLK@@z  iyDDDDDDDS_                   .-7u}FPgh.         "|       
        -I=`   T@@$cJ()))f@@L  YPSDDDDDDD2                   a$gDDDDDD(,                 
          _*_  !W@8EUUb6Ub@W_  nD%%KpecfY$`                 #$DDDDDDDDDP                 
           !t|` o@M6|tYV|{Wy   vDC+j+tt+Lr                |UDDDDDDDDDDDE.                
            it*^!3Uc77{77}T`   -d2t+{tt}I    ...  ... ..  ZDDDDDDDDDDDDDJ                
              )wN3Y}tlttt1-    :T(tt\?+\I    Y$$tI$$9 u$  FDDDDDDDDDDDDDu                
             ;w@@@M]t<;/tr      |vttt+tt/    oDDC3DDOoED   BGDS$gHDEd5KQt                
             .o@@@@QYt5vXf      .\jlr!It^    oDDDDDDDDDD   aP7\TzTov(+uNi                
               ?Q@@@@wVG@MJ      ][?> 7*     "^^^^^/\L?i`   vx{}{t7?xzF|                 
                ^K@@@@@@@@@x   .7UA-l GCI        ~ttt+f=.  :f?t+j?tttt+^                 
                 c@@@@@@@@@@u :]a0$-Z=Dq2+    -r*7xttv]t-  ,f?/||||||*?                  
                 s@@@@@@@@@@@y[ZaPO+XJOCahv  |?tI~,-;i*tt11+\zj^` ._=I,       .;.  :     
                 a@@@@@@@@@@@@9ZaZ%ydhbZahVJ. *,      .|V4443kVnL<vzVl        :_.:-      
                 4@@@@@@@@@@@@MpaZk6S9PZaxVhc `     -.  J444hkkkkahZCCv       . `        
        .`       E@@@@@@@@@@@@P)aZaEHHaZa|l3V     .``-`.:V44Ckkkkkkkkk3)                 
       ,-,_      K@@@@@@@@@SOK*{aZaZbUaZaI IT..`-:.      rZ44kkkkVkkkkkV{.               
       .,.;,     $@@@@@@@@@0r, jaZaZCPaZa> `*i:.          *k4hV(17kkezkkVT`              
         -.      Q@@@@@@@@@Z   \aZaZaZaZaj|1tj             y4Z[IFkkk1ykkVVz-             
                .M@@@@@@@@@b   {aZaZaZaZaTjv\ql            Y4Cnl)n]u+2kkVaau;       |;   
                "@@@@@@@@@@8   caZaZaZaZa),:.Fmz`          c44)f17IIiykkVVVaY_      ~.   
                 @@@@@@@MWN#`  uaZaZaZaZa\   oDmOy<.       z44kVakVVakkk3VaaaF;          
                ;A$GwH#####{   ldbddUdUU]!   oDDDDQ#Y^     y44ZkkkkkkkkkhsVVVY;          
                 e#########}    hkhhVhC0wL   2DgGw$ODgu.  !444Ckkkkkkkkkk [a2(1-         
          ,l     e#########T   |hpH#6EGDU`  -9DDg$gDDDD]  z44443kkkkkkkkk ,n1tti         
                 e##2i~,-S#z   Ih39DDDDG{  `3DDDDDDDDDDw`/d5444hkkkkkk3PX  -.=t"         
                 e##n    d#]   <hkhX0#DOZfzbDDDDDDDDDDDD! A@&Rg$w#$DQN@@d     `          
                 e##]    p#n   *hkhhVADDDDDDDDDDDDDDDDDb. d@@@@@@&@@@@@@O                
                 e##z    P#Y   lhkhhVhHDDDDDDDDDDg$G$OD(  O@@@@@@&@@@@@@W.               
                 e##c    k#y   thkhhVhAODOHGDDDDDDg$OD4. .W@@@@@@&@@@@@@@!               
                 e##J    y#e   jhkhhVhhAgDDDDDDDDDDDDE,  "N@@@@@@&@@@@@@@I       >       
                 y##7``:-Y#h,,,(hkhhVhhVySDDDDDDDDDDC^;;;nD8m&W@@&@@W&m8Ds       =.      
         `:,;"__v8RHT!!!!u$We!<dDb5hVZdR8LY9DDDDDgp(!!!iCDDDDDDDQRQDDDDDDD]";,-`         
       ._!!!!!!rYyyo1!!!!jyyytuyyyy[7YyyyY ^+Tu]{=!!!!!\uuuuuuuuuuuuuusYYYs|!!!!_.       
         .:-,;"_~~!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!~~_"",-:.         
                   ..``::----,,,,,;;;;;;;""""""";;;;;;;,,,,,----::``..                   
xuzuning 2017-11-13
  • 打赏
  • 举报
回复
如果字母占的面积越大,亮度越低的话。那我们可以先测试一下
for($c=32; $c<127; $c++)
 {
  $r[chr($c)] = 0;
  $im = imagecreate(14,14);
  $bg = imagecolorallocate($im, 0, 0, 0);
  $textcolor = imagecolorallocate($im, 255, 255, 255);
  imagestring($im, 5, 0, 0, chr($c),$textcolor);
  for($y=0;$y<14;$y++) 
    for($x=0;$x<14;$x++) 
      if( imagecolorat($im, $x,$y) == $textcolor)  $r[chr($c)]++; 
}
asort($r);
print_r($r);
Array
(
    [ ] => 0
    [.] => 8
    [-] => 8
    [`] => 8
    [_] => 8
    ['] => 8
    [,] => 9
    [^] => 12
    ["] => 12
    [~] => 16
    [:] => 16
    [=] => 16
    [;] => 17
    [!] => 18
    [<] => 20
    [|] => 20
    [/] => 20
    [+] => 20
    [>] => 20
    [\] => 20
    [r] => 21
    
  • => 21
  • [z] => 22 [{] => 22 [}] => 22 [i] => 23 [l] => 23 [(] => 24 [c] => 24 [)] => 24 [L] => 25 [?] => 25 [j] => 25 [J] => 26 [T] => 26 [v] => 26 [t] => 26 [7] => 26 []] => 26 [[] => 26 [x] => 26 [1] => 27 [I] => 28 [o] => 28 [Y] => 28 [s] => 30 [Z] => 30 [f] => 30 [F] => 30 [n] => 30 [u] => 30 [e] => 31 [3] => 31 [2] => 32 [C] => 32 [y] => 33 [a] => 33 [q] => 34 [p] => 34 [E] => 34 [k] => 34 [4] => 35 [0] => 36 [g] => 36 [S] => 36 [P] => 36 [X] => 36 [V] => 36 [h] => 36 [%] => 36 [G] => 37 [5] => 37 [#] => 38 [w] => 38 [b] => 38 [d] => 38 [6] => 39 [9] => 39 [O] => 40 [8] => 40 [U] => 40 [K] => 40 [m] => 41 [$] => 41 [A] => 42 [&] => 43 [H] => 44 [D] => 44 [Q] => 45 [@] => 46 [B] => 46 [R] => 47 [W] => 52 [M] => 52 [N] => 53 )
伟洪winni 2017-11-13
  • 打赏
  • 举报
回复
引用 1 楼 u011516112 的回复:
参考:http://bbs.csdn.net/topics/391981087
不是我想要的效果图
wodebaobei12611 2017-11-13
  • 打赏
  • 举报
回复
一、主要内容:OpenCV能够实现强大丰富的图像处理,但是它缺少一个能够支持它运行的界面。Csharp经过多年的发展,得益于它的“所见及所得”能力,非常方便编写界面。这两者如果能够“双剑合璧”,将有效帮助实际工作产出。本课着重推荐GOCW采用“Csharp基于CLR直接调用Opencv编写的算法库”方法,能够将最新的OpenCV技术引入进来,同时保证生成程序的最小化。    为了进一步说明Csharp和OpenCV的结合使用,首先一个较为完整的基于winform实现答题卡识别的例子,相比较之前的实现,本次进一步贴近生产实际、内涵丰富,对算法也进行了进一步提炼。同时我们对WPF下对OpenCV函数的调用、OpenCV.js的调用进行相关教授。       二、课程结构1、 EmguCV、OpenCVSharp和GOCW之间进行比较(方便代码编写、能够融入最新的算法、速度有保障、方便调试找错、拒绝黑箱化);2、视频采集模块的构建,视频采集和图像处理之间的关系;3、视频采集专用的SDK和“陪练”系统的介绍;4、在视频增强类项目中和图像处理项目中,算法的选择;5、Csharp界面设计、图片的存储和其他构建设计;6、较为完整的答题卡识别例子,兼顾界面设计和算法分析;8、WPF基于GOCW也同样可以基于GOCW实现算法调用;webForm虽然也可以通过类似方法调用,但是OpenCV.JS的方法更现代高效。9、关于软件部署的相关要点和窍门。       三、知识要点:1、基本环境构建和程序框架;2、CLR基本原理和应用方法;3、接入、采集、模拟输入;4、图像处理,通过构建循环采集图片;5、增强和实时处理;6、基于投影等技术的答题卡识别算法;7、存储、转换;8、部署交付。        课程能够帮助你掌握Csharp调用Opencv的基本方法,获得相应框架代码和指导;从而进一步提升实现“基于图像处理”的解决方案能力。  

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧