SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

画像からASCIIアートを自動生成する

画像に最も近い文字を判定する方法


  • X ポスト
  • このエントリーをはてなブックマークに追加

プレビュー

 本稿のプログラムは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);
}

アスキーアートに変換しやすい画像

 アスキーアートと言ったときに私達が思い浮かべるのは線画でしょう。従って写真のように複雑かつ滑らかな階調を持つ画像はアスキーアートで表現するのに不向きと言えます。試してみると分かるのですが、「遠目で見れば確かに……でもなー」というのが私の感想です。どうしても写真をアスキーアートに変換したい場合は画像処理ソフトで線画に変換した画像を入力してみてください。

写真
写真
アスキーアート(MS ゴシック / 標準スタイル / 10pt)
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 次善策の使用]で、[はい]を選択する

まとめ

 「はじめに」で示した問題は次のように解決しました。

  • 文字を画像に変換する方法
  • →DIBSection を用いる
  • 余白を含めたフォントサイズを取得する方法
  • GetTextMetrics関数
  • 画像に最も近い文字を判定する方法
  • →射影ヒストグラムを用いる
  • 画像を2値化する方法
  • →誤差拡散法

 今後の課題としては、画像に最も近い文字を判定する精度に向上の余地があるため、射影ヒストグラムを用いるのではなく、全画素について比較する最も基本的かつ正確な方法に原点回帰してみると良いかもしれません。処理時間はかかりますが。

 最後に注意ですが、公開を前提にアスキーアートを作成する場合は、見る側の環境をよく考えてフォントを選択してください。

参考文献

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

ひよこ(ヒヨコ)

職業ゲームプログラマーを志す学生です。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/345 2006/05/26 15:42

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング