SHOEISHA iD

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

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

特集記事

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

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


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

文字を組み合わせて絵を表現する「アスキーアート」を知らない方はいないと思いますが、これを作れるのは一部の職人だけです。しかし本稿で紹介する手法を用いれば、職人には遠く及ばないまでも、誰でも簡単にアスキーアートを作ることができます。

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

実行例
実行例

はじめに

 文字を組み合わせて絵を表現する「アスキーアート」を知らない方はいないと思いますが、これを作れるのは一部の職人だけです。とても素人が作れる代物ではありません。しかし本稿で紹介する手法を用いれば、職人には遠く及ばないまでも、誰でも簡単にアスキーアートを作ることができます。

 画像からアスキーアートを自動生成するのに問題となる事柄は次のとおりです。

  • 文字を画像に変換する方法
  • 余白を含めたフォントサイズを取得する方法
  • 画像に最も近い文字を判定する方法

 また単色である文字と画像とを比較するために

  • 画像を2値化する方法

 も解決しなければなりません。本稿ではこれらについて一つ一つ解説していきます。さらにHTMLにも対応することで文字の色やフォントを指定できるようにしました。

対象読者

 「C言語」「Win32API」および「DIBSection」を理解している方。本稿で紹介する手法は小技の組み合わせなので、難易度は超初級です。画像ファイルの読み込みに関しても私が作ったクラスを使いますので、その仕組みを理解している必要はありません。

必要な環境

 Visual C++ 2005で開発、Windows XP Professional SP2で動作確認しました。

 私も含め、Visual C++ 2005でビルドは成功するのに上手く動かない……という方のために、動く実行ファイルの作り方についても本稿の最後で簡潔に紹介します。

文字を画像に変換する

 画像と文字を比較して画像に最も近い文字を判定するために、文字を画像に変換する必要があります。これを文字画像と呼ぶことにすると、欲しいのは文字画像のピクセル列です。ピクセル列を直接的に取得する関数もありますが、かなり難しいため、間接的に取得する簡単な方法を紹介します。

 文字画像のピクセル列を間接的に取得するためにはDIBSectionのDDBにTextOut関数で描画し、DIBを参照すれば良いのです。DIBSectionはHDCを持つDDBと、ピクセル列を直接参照できるDIBの両方の性質を併せ持っている、ということを利用します。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
余白を含めたフォントサイズを取得する

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

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

もっと読む

この記事の著者

ひよこ(ヒヨコ)

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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング