プレビュー
本稿のプログラムはGUIのWindowsプログラムなので、アスキーアートのプレビュー機能があると便利です。プレビューと言っても、一時的なファイルにアスキーアートを保存し、シェル経由で実行するだけです。
#define TEMP_TEXT "temp.txt" #define TEMP_HTML "temp.html" // テキスト形式でプレビュー // char *text : 文字列 // HWND hWnd : 親ウィンドウのハンドル void PreviewText(const char *text,HWND hWnd) { if(text==NULL) return; SaveText(TEMP_TEXT,text); ShellExecute(hWnd,"open",TEMP_TEXT,NULL,NULL,SW_SHOWNORMAL); } // HTML形式でプレビュー // char *text : 文字列 // LOGFONT *pLF : フォント情報 // DWORD *pCT : カラーテーブル // HWND hWnd : 親ウィンドウのハンドル void PreviewHtml(const char *text, const LOGFONT *pLF, const DWORD *pCT, HWND hWnd) { if(text==NULL || pLF==NULL) return; SaveHtml(TEMP_HTML,text,pLF,pCT); ShellExecute(hWnd,"open",TEMP_HTML,NULL,NULL,SW_SHOWNORMAL); } // プレビューに用いたファイルを削除 void RemoveTempFile(void) { remove(TEMP_TEXT); remove(TEMP_HTML); }
アスキーアートに変換しやすい画像
アスキーアートと言ったときに私達が思い浮かべるのは線画でしょう。従って写真のように複雑かつ滑らかな階調を持つ画像はアスキーアートで表現するのに不向きと言えます。試してみると分かるのですが、「遠目で見れば確かに……でもなー」というのが私の感想です。どうしても写真をアスキーアートに変換したい場合は画像処理ソフトで線画に変換した画像を入力してみてください。
W@WWM@@WM@,V@V""ノク&カ@" /@@$%W/(ライAW%$W&W/A@@%X&V>"S@リ((ミハ%Vウ@/VyV&y WW%Wサ@WWカ$ムVWW@ムa"/ス/ggW%W$%%g/YSV7ミ%&メWW#@@WW@@%VWg'V<><y/%A%M%W>/W% /Zム%%タ$%M#&g&~V%&a"WWWWCW%WWメ@%&゙ケ/W&$%WM$@&Vシ@3タハ@,、%//W/SQ%%y(、/'& W@%" S@@@@ケ%$W( @カW%AVク)%WW&X゙フケV%$XW%WV゙@Wツ@%M%7%@@メノノVシ/WXツV%//^/ウ' %%"。c%//A/゙/@W&ノVg~"4クW#W3WWa、 W@W&タ%カ@゙イWG%カ@MW%%W%/ノW/"W>>Xカx>>3 /ラ//Vサ@$@@@@@%&XWソW %A_W&ス//シWW@X//%W0/&MO@&A&ツカ@V/ノd@%W@WAY./ミCン/ , `-/ムA@ム@@@@@W%W%" %A VWWヤ&/シ</W/Vン<`タ%&ノ@W@WCW0%@&/(/&%8WサVe%SS,ノメAS2 /g@@%WW@M@@シ%$@%g/$ソ、`,ン/@AノムX@%%&ン>ク@ミノ@@0@&クW@%%//V@#M^% '%%&&SW#%f @%7"ンメ#M@@@@D##M$MM%(ヘ>WツWW>*シ%@@@W>/$</$WW@/ゥ%M@M@@oスウW@ ^<カ@@@@M@@K %ハ2<W@@@ハ%$#@#8W@#@M$@gツ$A//>Aa@@@リg<@<ソ@WW&V$M@X@@MW@@Xwa$&gM@@@@M%( /"~"/ウ/シ&"#@M$^$&M@M#WウM@@@%S//^ウ@&&/%/カ#%@%@#M#VW%@MM@&ム5W@W@@@@@*タ( & A>/)0%M#@@%X#@@M@$(/$@@@M@@@@カ@%$Wg%$W$M@M#@Wワ[@%@MM@MM%ム@MMMp@@。` @@$W&^ソ@MMMW@@%##M&"@MM@@@@@@@@$%%W%%VカW@@M@@@%シA@@M@@$@WウW@MMM@@$W@6 @@@W@/^WM@@O@$%MM@$M%%Vス%Wケy= ノ%@%#%@%W@@@@@WW@@WVW%%@@MM@g#MM&@W@%/> W@%W@@@@@MW%M##MM#MM#@W$G$@@@@@@%M@M#@@W@V/g@@W/カA@MWVY@@W@M##@@BWMM& @@@カMM@%MM@M#MMM#M%#@W@M@@MMM@%$@$M@@@M@@@@@@Wg@MMMMM@"、_AM@#M@@@%ウW% @M@@M@M@M@#MM@$MMB%yX0W@M#M@MM@MM@Q%ムM%WW@W#@@$###M#ヤ`g@##MMM#MM@,WS( @@S%%W%%M$WM@#MMM@W@MMMMM####MMMMW@M#Mサン/@M@%MM@MMM&A@@#@@#MMM@M@$ノ$& W@@MMMMMM(WM@#M#M@MMM#M#####M@@@@MMMMM#$$MM@MMM#MM%ス&&@MMMM@W@#WMM@ム& MM%WMMM$%/$#M##MMMM###MM###MM@$MMMMMMMM@M##M@M@WW$@MMM#MM##M$ゥASW%/'' ウ@@@@M@M@M#MMM#MMMM#MM####M@MM####MM#MM%$M#M#M#M#@@M@@MMM####M@g/*@@ィ @ム&サ@#M@@@@W$@M@MMMM#M##MM@#######M@MMM@ $M####@M#MM#MM#M#M@#M##M@XW& %%#MM@M@@@@M@@@#M###Wg#########MM#Q####@MM####M&ソ###MM###MMM@#M$W2ク@t キ%@MMMM@M&&%MMMMM#MMMM###MM#M########M@#M#M####@####MMM#@@@@MMW/ムg] ムク@@$@@MMY&Q$@##M@MMM#M##MM###M########M########M#####M##MM@@ヌg/SS@M$ @ル/"V@@@M&//@MM##M#M@MMMM#@M##MM#M#M#M##########@#######M##M#%@M@@@@g W&$ン&ヌ@@M@ン/$M#MM#MM$MM@@M######@M#############M############MM#MMMMM& '<Wム'<%8$MC<%MMMMMM#@/%@M#######MMM$M#########MMM@MMMM#ウWMM@avgg,u%$f c。ノ%/'/W#M//$WMM@@ケムA@M#######MMMMM#MMM###M######M#M@#M#MM#MMM@M@AM@& @/ ヘ/&ノカ3%/ノ&W@0sA@$@#MM#MMM@@MMM####MMM##M#M@#MMM#@タ@MM$$ハMMM@@@#@@ル /Wo&A%&/&%/"DWハ%%$@@@#M@@MM#MMMM##M#M#####M@MXWM#MM@%VM#MDツ@$$@#%AAVヤ "~ツYクWWク%%ム)/<?クVW@@@M@@@MMMMM$MMM@#@M#M$$MMM$<ウ<@#WV3MMM<Aソ2)S@@@M#ル ゙//yyaAWWWMVSW//メAaW#クV#W@W$"ウWM##M#MMMM@@MMM#@> ゙ノツ<?S@$ム%a$@M"<$@Mル $@%@$WW$%#>ンケ83ン ~ク$AA@( `^ノ<AMMMMMM@M@@%%@@#M@, ノ<=SWM$V%#@$@@@MMK XW%9%@@W$6・^@@/Vメ/ ^ソW@@Mム$M@MM@M#MMMM@W%@AXメ/WM# ノ@/y//ケン(/@@@M@M@@ヤ %@ク%&@W@@^ ノW@@gツWム>、、シ#@M@@@M#MMMM@%WW/ム%@$6/,"W@>@%@ルノ/ノ(/@$@%@@@W& >^@WNケ%@ <@%<%% <@W&Aa%@@%@0@@@MMM@@@m ^"W@@@a` ゙"/@XWo@WV@@%W@@%%@&
Visual C++ 2005で動く実行ファイルを作る
Visual C++ 2005で動く実行ファイルを作るには、[プロジェクト]-[プロパティ]で以下の設定を行います(Release版)。
- [構成プロパティ]-[C/C++]-[コード生成]-[ランタイムライブラリ]で、[マルチスレッド(/MT)]を選択する
- [構成プロパティ]-[マニフェストツール]-[全般]-[FAT32 次善策の使用]で、[はい]を選択する
まとめ
「はじめに」で示した問題は次のように解決しました。
- 文字を画像に変換する方法
- 余白を含めたフォントサイズを取得する方法
- 画像に最も近い文字を判定する方法
- 画像を2値化する方法
GetTextMetrics
関数今後の課題としては、画像に最も近い文字を判定する精度に向上の余地があるため、射影ヒストグラムを用いるのではなく、全画素について比較する最も基本的かつ正確な方法に原点回帰してみると良いかもしれません。処理時間はかかりますが。
最後に注意ですが、公開を前提にアスキーアートを作成する場合は、見る側の環境をよく考えてフォントを選択してください。