2値画像からアスキーアートを自動生成する
以上の関数を呼び出すエントリーポイントとなるプログラムは次のようになります。原画像の一部を切り取るSplitBmp
関数に渡すyの値が大きい方から小さい順になっていることに注意してください。アスキーアートは左上から作る必要がありますが、DIBSectionの原点は左下にあるためです。
// 白黒ビットマップからアスキーアート作成 // char **ppText : 文字列 // BmpIO *mono : 白黒ビットマップ // LOGFONT *pLF : フォント情報 void CreateAsciiArt(char **ppText,BmpIO *pMono,const LOGFONT *pLF) { if(ppText==NULL || pMono==NULL || pLF==NULL) return; DeleteAsciiArt(ppText); // フォントのサイズを調べる BmpIO charbmp; AsciiToBmp(&charbmp,'a',pLF); int cw=(int)charbmp.GetWidth(); int ch=(int)charbmp.GetHeight(); // ビットマップのサイズ int w=(int)pMono->GetWidth(); int h=(int)pMono->GetHeight(); DWORD textlen=0; HANDLE hHeap=GetProcessHeap(); (*ppText)=(char*)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,textlen+1); BmpIO splitbmp; int c; int x,y; for(y=h-1-ch;y+ch>=0;y-=ch) { for(x=0;x<w;x+=cw) { // ビットマップの一部を抽出 SplitBmp(&splitbmp,pMono,x,y,cw,ch); // 最適な文字に変換 c=BmpToAscii(&splitbmp,g_ci); (*ppText)[textlen++]=(char)c; (*ppText)=(char*)HeapReAlloc( hHeap,HEAP_ZERO_MEMORY,*ppText,textlen+1); } (*ppText)[textlen++]='\n'; (*ppText)=(char*)HeapReAlloc( hHeap,HEAP_ZERO_MEMORY,*ppText,textlen+1); } (*ppText)[textlen]='\0'; } // 文字列のメモリを解放 // char **ppText : 文字列 void DeleteAsciiArt(char **ppText) { if(ppText && *ppText) { HeapFree(GetProcessHeap(),0,*ppText); *ppText=NULL; } }
テキストファイルに保存する
テキストファイルに保存するといってもアスキーアートが格納されている文字列を書き込むだけです。プログラムでは1文字ずつ書き込んでいますが、これは全文字を一気に書き込もうとしたところ、なぜか失敗したためです。
// テキスト形式で保存 // char *filename : ファイル名 // char *text : 文字列 void SaveText(const char *filename,const char *text) { if(filename==NULL || text==NULL) return; FILE *fp=fopen(filename,"w"); for(int i=0;text[i];i++) { fprintf(fp,"%c",text[i]); } fclose(fp); }
実行例を次に示します。
、 、 A@@Wg 、 、^ 、 _ ^, gW' アA、 、゙_`、゙、`<^<- 、 -,^^ <->- 。@~ー 、 ウA、 ~- - >_<、`、 ^^` '、^> gW - 、゙ ^ Wg ^/,^ーッ> '゙ ><'、 ^^^、^、^ W" ゙・ ` "& `、 ` < ^ <`/ 。W ^ - ,'. ソk `、^-/, . ^ -` 、、゙` ^-` g@%VクVク&>ヘvvvc_・```、 $ _/^-、 ゙ _@@VA//_ニ>ンWVW$SV/"ヘy。 オ '^ -</<ー゙ 。@@%%/gWVケW%/ <''ソWggggaWe。オ ^ -、゙ _@@%@YVAム/-゙、<ウWgWAAW//"クWgン@# ^ 、 _gm@@@@@$W%_"/"%ケWWWV"、/V3m/>gW%%WWMg ` _AW@@W%WW@WWW$&*WWケ"、 ^SWoノagg&/ツVW$@$W゙V@ ハ@$%W@@%$WW%W%カ%`_ヘウムmmgaA/~/WA/`^^<>@WVPYフ@_ @%$WW@@カ3W$W9サAWAwW"/~"クa ___ン%W%$@Wク <゙//W$@&g_ @W%%W@W/@%%&@/<"W*ムg,,_カVVケ%%" <^"W%<ー^g%>・"V$@@A, W&?@タ*スW2^ン%agoggVVVW%, /クWAAgAwW>/ノ$W&^/>/'"/W\g フ@/~<"<゙。///ヘウ8j~>` '%WW9WVVー/"4 <%W%WノW&/(、^~ " ~Wg @ム・ ンムa/>/_゙_%WWWWタ/.<"YWg/aンQ、&%%WMッノ%&>^> ^ ~@g _%@@@W%W$W%%%" ・^/V$a&amaW"YV&M5ノW@@@ ソV゙ ^、 ゚@g _@M@@W$@$W%@-,'/WA*mwAX^/VVa,<< $ /%@@@g ^^ a ウ@ 。@W$%WWWW%W@#WWWW*ケ`ッ"Vwg/゙_"/WYYケ%M, %W@\$@,`゙、 W, "@ AW"ク/ンVWWWV@% "WA%Va。/。/S@ツ%ク%%QSア/- $ 、"W% ウ@g " Mg "& @" "・`@V^^# ~ZW@@\&%カN@$WW>^゙/゙<クc ノ$< #& @A ウK @evag_ ゙ _ニM" $@@WV、` "<>$、 ^<d % K "&@, カ, ~~""~~ $@@/_゙ N> ^ノ $ $ V Wg @ $゙~%WA2 & ノ @ オ % $ ゙& ソ& "ウWカA_# オ ノレ $ "y @ "& 、 、 $ & ~# K U K $ カ ゚W ^ , ` >~ 、゙x ー^ 、 @、 d オ UVwd W { ハ W ンSVgxッ,,>,/、^,- ,` 、 W, 8 # 」 ~。V __zeweゥ7 ソム /" //VSウツスASSS/"、 ^、^ W, % レ オ ウVwewVV"~ V。o ^・/メ&VVVX/'>、'><゙、,、 %V d k <ウg&VVS2/゙ 、/、 ゙<` ^` '`^゙_ & V 、、 、 </VVSS2S2Sェ,` ` 4a。。vヘ" ゙ '`- ー