Netpbm ASCII Art

These programs are probably originally 15-20 years old; I kind of think I might have written pgmtoasciiart.c at UO in the early 1990s.

This suite consists of programs to convert ASCII art to PBM and PGM format (asciiarttopbm, asciiarttopgm), and a program to convert PGM to ASCII art (pgmtoasciiart), along with a helper script for the latter (mkasciiart). The programs are currently under the MIT license. I would like to get them incorporated in both "mainline" Netpbm and in Debian Netpbm; the software builds both places. However, I've done about all the work on them I'm willing to do for the foreseeable future, and both Netpbm lines have…"interesting" constraints on submitting source and patches.

See the README included in the distribution for more information about these programs.

Left: Sample 132-column mkasciiart output; Right: Result of recycling this ASCII art through asciiartopgm

                                                          `                                                                         
                                                 ``````     ````````` ``````                                                        
                                            ```        `   `                  ````````````                                          
                                        ```     ` .'_!+YFhhyIf1\:,,,  `..,.  `              ```                                     
                                      ``   ` ,////(][F$Q88N#W8pVf((<<fFfJFfFFfl?(//;_,,,.     ```                                   
                                        `"<Y{Y+\<tk6MWW#8N6E8DPV}v?FI}FVGppAwIFkPZPwVYcL?<<!/'    ` ``                    `         
                                  ``  .(CIVC<!!YUgN@MNpKDNg08#g68gAU8MgdZPZqQKPVVUKqGAm$%{fCCYc!:,,`   ``                           
                                    `:!<?]/,/Lwpp##N0Q00O0EQp8@##8NNdE6##6UP3KAUPP$DQKZ$bE3VIywZkJ<\",`  ``                         
                                 `._/<lf{!:][FAmNBNmm888DU$pK3dN8N0D80aANNN0mdAO$KKP3qmKUdKGUZk3UPZwFt+,   ``                       
                             ` `'!l%FoUV+JKdVyU##@8gg#@BNpAQmmQN8N@g0&gm0888#886m0mQpDm6mqpmAdpUGU3ZGUPI1('   `                     
                            ` -!FUmp0NKkb@@Q0}&W@W#8@@WW@B0Kg&N8#BW@N&NNN#NgNg&MMBBMN8#8BgqaDp0Ngd$UaA60DwF(,  `                    
                        `  ``_}pgN#8aDgaN@@#&0@@@W#NW@NdKwIIw3$Vdg8W@MBB8NN#BNNNW@@WWW@B@B8EK0NNBgbUAEpNNgGwVL,  `                  
                       `   `,VNN#@#wkmlCQN@@#BN@##N8&F\__._<=CF?13UgN@W@@@NM@@@WWW@MM@@@W@@B88N88B@gpg0QNW#bZVy/   `                
                     `    ,,"6kN@Wg8U1,=Ig@@@86g88mmg1`  `:;/(L=(]FGD8@@@@@@WWW@@@@@@@@@@@W@@@B@BM@@@#MMBW@@8awZC:                  
                    ` `.  (<!+0@BBgEV?:=VB@BgU8Ngk]1IEf,.,~`'!"<!!f$Q8MNB@@@@@@@@@@@@@@@@@#M@@@@@@@W@@@@@@W@@WgK$w! `               
                      ,  ^EF,F@BNDPkF?+VB@@g1<AMgt"!!!1F|/!\;!(:~\[UQN@NB@@@@@@@@@@@@@@@@@@BWW@@WW@@@@@@@@@@W@@WNQEY;`              
                  ` `: /"a8K!g@8P%F1!/+%a8@Ww/($gZ/.   ,/!/r<!<=_';(PEgNBWWWWW@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@W@@@W@N* `            
                 `  ,',$Pm&m!bWmI}+/;::c\!3N@@QPkF(_ `  ````   ,/",:!FGm#W@@@WBWWWWWW@W@@@@@@@@@@@@@@@@@@@@@@@@@W@@W@0` `           
                ` `fF,;08g@U,Cgac+/,  ` '`,"!c1<;.  ` ``         `.:_"\FkamNNW@@@@@@@@@@@W@@@@@@@@@@@@@WW@@@@@@@@@@@@@F `           
                 `Ff!,!GNm&?'1Yr-  `    ` .              ````` ``    ``,"/!!+CIwZUGd0g#BW@@@@@@@@@@@@@@WW@@@@@@@@@@@W@N, `          
                  ;!!//f88Y/!.      ``` `     `   ```        `` ````      ''-,:,:"/!<=J%ab#@@@@@@@@@@@@@@@@@@@@@@@@@@@B, `          
                `  ,`_'"0@F'  ```       `   -,,,....  ``   `` ``            ``` .',_;!!!<JE@W@WW@@@@@@@@@@@@@@@@@@@@@@W: `          
                 `',/,,A@B"       `.,:/!*!/!!!!/;__:,':"/!*r<!/;_'. `` `        ,':"/!(((<IN@@W@@@@@@@@@@@@@@@@@@@@@W@k `           
                ` `?= FMN$::_/?[1}kZZUD0mAG$akyFf=r/"//+vYfFIFIFVPVFJv+!!^"_',`  ._!<+<++=kB@@@@@@@@@@@@@@@@@@@@@@@@W@3`            
               `  ,f<!Fg@v `  '/[fFCIwkwww$QgNmVv(!""//?FD8#BBN88#80E3w%yyIFFC]c<*!!+cc?+Fg@@@@@@@@@@@@@@@@@@@@@@@@W@N3! `          
              ` :<JvF}a@@;   `!|!<1%GmggpgNQg#@N%!' ` :~VW@@@B88g6ggmaw%IFf}}]j1fFkP{tYf[hQWW@@@@@@@@@@@@@@@@@@@@@@@WWV, `          
               :YkbGwm#@#:  `/?!?Vm#@W@W@W@@WM8N{`````:CN0#@MMBB#88B@@@M#NDUaawI}]fVVaPpN88M@@@@@@@@@@@@@@@@@@@@@@@@@@3 `           
             ` ;<+CC1JP@V   ,_,`,<1V$dUU$ADg6w#?       ;&AZ3kk3ZwwwwUKEbE3yICIaqAAqE08PVFffwB@@@@@@@@@@@@@@@@@@@@@W@NY: `           
                \$Z3JfI8/ `      :!vk$ZUKbQZCA}-`      !K@Wh+[fFIFC1+!!/;~__!/rLYCVkV$//!!(tN@@@@@@@@@@@@@@@@@@@@@W@U  `            
              `  /FA1?bd. ```` ` :/fPOZwV1"'/, `     ` :YZNI;^//!(=]tL++<(/;";;!<c]!V?.~;/<YQ@W@@@@@@@@@@@@@@@@@@@W@w `             
                  'v?!!!         '^\*(*/' ';` `         ,!?wf/:,'':,__:'..,::::^/!!c]``,_/*+FN@W@@@@@@@@@@@@@@@@@@@@F `             
                ` `".;!.,,,.. `` .,.,_!!~_,  ` ```````` `:c1Y1<(/:'..`.`` .,,::~!/(/``.::/!<lUW@@@@@@@@@@@@WW@@@@@W@( `             
                  `/;:, ` `,':':':,~/!!!!<-  `         ` .!v]l<!!;;;_,,':,::_:_::'`  ,_;/!r<=vPN@@@@@@@@@@@@@@@@@W@d  `             
                   /<^,         `.,;!?fV$!    ```   `:^!_, `,<VI<!/:',.` ```     `.:,~/!(<==L?lC0@@@@@@@@@W#8WMKGMN' `              
                   -!\' ` ```  ,:/(+lIkPI``!1!'<IIffFZmmDw?!!vUwVIIv<r/";:_,.',.`.',:"!\(+?cvj1YVDNMB@WWW@BKaNy<%@I                 
                    .", `    '!/+c1Co%It[|<FV}/'*%Kb8@@@@@BN6Z=;/+fI}J?(\!//!!";""^//!(!!<<[f}fFVkd8WBW@@#bK8I^?N@! `               
                     `      `!fCF%wPI?*\!~'` `/==F6N@#8gQEAV[!,,,_/<v}{Jt]=((!!!*\(<++?(*(+YfII}Fw$mQwIkkf}V?:!Q@&  `               
                          `  t$w%kZf\/,,``   "IQM@@WN0$w}l+//"!;:,_:;!?v1FF}[=c[lL[]vc<+<<lLY}fFVkUF?\/!/*!,'?0@@@N* `              
                          ` 'fZj]Y!_,       `,/vJ][]=!/!__:,,':"//!*/!?fflLCFCfJt11vv|??cvl]FIFo%V3F!;:::'_?A@@@mPQF' `             
                          ```:^_<<!lF!`` ,,':+FIFIFF}}F{jc?<(!!!(=FZPyFfIy++[[Yfffv<<<<L=YJfJFIFwZN8aI1YVD#@@@@F  ` `               
                          `  ` .\jVpB@8mgw(!\JV3wUmmpQm0N8N8M@@@N8W@@M6y]+!//r]J}fLLl?Lt11v[fFykZdW@@@@@@@@@#]:  ` `                
                          `     *L1FyVI<~ `    ` ,:::::,:_!!!(+[f1?1IFfl(!"//!<jf=L]cLfY[]1Fyyk$Gg@WWWWW@@@0,  `` `                 
                             `,~Y}Yt<:`      ~+FVZ%IIFJ=!!"/;_"::_:_;<cLLl<+<?}VF1YJ1f1fFVyVwZKQN#B@WW@W@@@! ``                     
                           ` `/(vZI!`  `` ` ,?}IIIIFfFyVFJfL?!//;"^/!*=}}1tCF%VwhyFIFFIyVkaAEQ8N8m0N@@@@@@A`                        
                            -_!/!=/. ``     ```':::;"";~":___;^/!""/!!*=JFFykZVIyVFyhPZkZpg08M@#daGm8AmQG[  `                       
                            ` /!;'``              `  ```  ` `,::"!"/(?v{CIVkw$GVVw3Z$dpmgN#MW@@6awZUD\     `                        
                              .";   ``      ` `` --..   `   `` :;!!!(?vfFIkZUKK$AOD00g8NBWW@WBN$w%wPB@g!   ```                      
                            ` '',;'`          ':~;"_~:'_::'_:"(c?r+1FoP3$Emmm06D0gNBW@W@@@W@@8APwVVQ@W@@p(     ``````               
                            ``I* ,~;: `    .,*?[=?L=L=??+?[1fIFVV%Zb68M#NNBBBB@M@@W@@@@@@W@N8QakyyUW@@WW@@#w!.`       ``````        
                          ```|@V   `,,.`,:/?JVUZPU3PZKdKaDN##88N88#B@@@@@W@@@W@@@@WW@@@@B#8NmUwV%w8@@@@@@W@@@6F?\"_,         ```````
                  ```    `  <M@0`     ` -,!JVQB@@@B@W@@@W@@@@@@@@@@@@@@WW@B@@@@WWWBB@@BBNNgpK3PZP&@@@@@@@@W@W@#QEQ06NAyv!:-         
             `````    ``  `/mW@@" ` `   `.,:!(y8B@@@@@@@@@WW@W@W@W@@@M#BW@BBBB@@@MBMB@#N#8gQAZwGg@@@@@@@@@@@@W@BpUakg@@@@W#&dVJ</,. 
          ``      ,,.`   ,*wb@W@F `     ` :~"~/vVgB@@WWWWWWW@W@@@BB#@W@WWW@@@@WMMBB@WBN#Ngmd$Ud8W@@@@@@@@@@@@@W@W&ak3wN@@N#BM@@@@B&Q
      ```    ._+I$w!`  :!?JCP@@@N` `      ':!/(!<CPp#@W@@WWB@BB@BBWWW@@B@B@@B@W@BWW@#8NgQEGbDgB@@@@@BW@@@@@@@@WW@@8wCyVaW@@BN8#N#B@@
   ``     ~[Z8@@8+  .':<|c+L$W@@@<      `  :"!(+<LfIUNB@W@@W@M@@BWWMNBBBBM@@BB@BB#N88&mEGUAp8@@W@@M#8#@@@@@@@@@WW@@#UJ}}f0@@BN#NMBM#
``     ;v$8@@@@I   !!!/r<r/?0@W@@8_  ``  `,':;!(+=[FZQ8N#@@MBM@@@BBMMBBB##MB@N##8Ng8g0mmg6g8NW@@@@NNN&@@@@@@@@@@WNM@B6y1FLk@@@N#8BNN
   ,/[ag@@@@@B<  '/<c//*!!_L#@@@W@8/`     :;!;/(=]}IPAQ8N8N#8#NB#8NBM##N#N8NN#88NN8g0gNN8N#MW@@@@@Nm888@@@@@@@@@@BN#8#N$f]rL0@WM@B#8
:/[UQ#W@@WW@N(: _=]L!*+/r/:1W@N#@@@#F;`    :";\ct}FP$Aqq088N8NNNNN#BN##8N88N8#888#8NNNN#BW@@@@@@@@@NmN6@@@@@@@@@@WB#N8N8&Ut!/I#@B@@@
km0#W@@W@@@g!/.:!!!=1Cl+=^ t@N8B@@@@8EI</"_,/!<=v1FUGOQmgNN8N8888####NNBBNNNMN#NMBNM##B@@W@@@@@@@@@#0&&NMW@@@W@@@@@WM8gmDQQZ[/v0BM#8
8MBW@@@@@@Z!l:!y+''?GPV{\, Z&mB@W@@@@MNQAwfvLLY][tyZA6NN#N##N#888#NB#NN#N##NNNBN#N##B#MBW@@@@@@@@@@@gK&A8#@@WWWM#B@@@@@N8g8N8V*Y0W#M
NB@@WW@@My"+:!oVI</c[Y]!!!fBCg@@@@@@@@@N8N0qGaPVIVVkAQ&N88#88888#NN@@MB###BN#NN8#BB#BB@W@@@@@@@@@@@@8KE$db8W@W@B#8NW@@@@@88&88k=Jbp@
BW@@@@WNF/?;?KUqK}LFff}!+F8AZ@@@@@@@@@WW@##NggggmE$AQ6g8N8NNN8NN88#BBMM#N888N8#N#BW@W@@@@@@W@W@@@@@@#QK8PNNW@@W@@@WW@@@W@W#88g&F+%yN
@@@@@NKf/(!fPFvc=tUg$Fc:~[8y0@@@@@@@@@MMBWW@M#N8&g6g88N8N888NNNNNN#MBNN#N8NN8N8#N#@W@@W@@@@@@@@W@@@@#PIaJw@W@@@@@@@@@@@@@@@@BN8g}LVD
@@@@Wat!!_Ch\/<IU&@@BU?',<$V#@@@@@@@@@NNN@@@W@#8Nggg&&gNN8#NNNNN#B#MBNNNN8N8g8NN#WB@@W@@@@@NKQ@@@@@@Bk]Fg8@W@@@@@@@@@@@@@@@@@@@@#wyd
@@W@$I/,,lav(lU#@@@W#E!`:wPA@@@@@@@@@@#0088#W@W@N8N88gN88N8###N#BMN#8N&0mQppQQ0gNN8N#N#W@@0C1JFKB@BWBgpN@@W@@@@@@@@@@@@@@@@@@W@W@@gN