- 実行例の元画像(kingyo.gif)
はじめに
文字を組み合わせて絵を表現する「アスキーアート」を知らない方はいないと思いますが、これを作れるのは一部の職人だけです。とても素人が作れる代物ではありません。しかし本稿で紹介する手法を用いれば、職人には遠く及ばないまでも、誰でも簡単にアスキーアートを作ることができます。
画像からアスキーアートを自動生成するのに問題となる事柄は次のとおりです。
- 文字を画像に変換する方法
- 余白を含めたフォントサイズを取得する方法
- 画像に最も近い文字を判定する方法
また単色である文字と画像とを比較するために
- 画像を2値化する方法
も解決しなければなりません。本稿ではこれらについて一つ一つ解説していきます。さらにHTMLにも対応することで文字の色やフォントを指定できるようにしました。
対象読者
「C言語」「Win32API」および「DIBSection」を理解している方。本稿で紹介する手法は小技の組み合わせなので、難易度は超初級です。画像ファイルの読み込みに関しても私が作ったクラスを使いますので、その仕組みを理解している必要はありません。
必要な環境
Visual C++ 2005で開発、Windows XP Professional SP2で動作確認しました。
私も含め、Visual C++ 2005でビルドは成功するのに上手く動かない……という方のために、動く実行ファイルの作り方についても本稿の最後で簡潔に紹介します。
文字を画像に変換する
画像と文字を比較して画像に最も近い文字を判定するために、文字を画像に変換する必要があります。これを文字画像と呼ぶことにすると、欲しいのは文字画像のピクセル列です。ピクセル列を直接的に取得する関数もありますが、かなり難しいため、間接的に取得する簡単な方法を紹介します。
文字画像のピクセル列を間接的に取得するためにはDIBSectionのDDBにTextOut
関数で描画し、DIBを参照すれば良いのです。DIBSectionはHDCを持つDDBと、ピクセル列を直接参照できるDIBの両方の性質を併せ持っている、ということを利用します。