AA自動作成ツール(途中)
前回AA作成ツールを修正すると書き、この記事を書くまで試行錯誤をしていた。
今回はその中身を書いていく
前回までのはC言語で作成していた。AA化のアルゴリズム自体に不備は無かったんだけど画像を読み込むときとか十分に大きく取った配列に画像を読み込むとかいう変なことをしてたので可変長配列を扱いやすいC++で書き直した。
それで書き直すついでにアルゴリズムの手順ひとつひとつを関数化してどこが問題になってるか原因をわかりやすくした。
特定できた原因は
・GetGlyphOutline関数
これだ。
これは与えた文字のビットマップを返してくれるwin32apiで用意されている関数なんだけど結構いろんな記事でバグがー、罠がーといわれている。私も例に漏れずかかってしまった。
帰ってくる処理結果は以下のような図になる。
GetGlyphOutline関数のフォント位置 様より勝手に参照
gmCellIncXが文字の空白も含んだXのサイズで
gmBlackBoxXが空白を含まないXのサイズ
gmGlyphOrigin.xがgmCellIncX上での文字の起点のX座標だ
この理解が間違えてなければgmCellIncX >= gmBlackBoxXは常に成り立つはずだ
これがまず変になってしまう
jをGetGlyphOutline関数に与えると
gmCellIncX >= gmBlackBoxXの関係が崩れる
というかgmGlyphOrigin.xなんか負の値が帰ってくる
ためつすがめつ見てみると以下の関係が見えてきた
gmCellIncX = gmBlackBoxX + gmGlyphOrigin.x
どのような文字をGetGlyphOutlineに与えようとこの関係だけは不変だった
文字の横幅のサイズが保証されなくなってしまったために上記の横幅を示す3要素をいじって試すかしかなくなってしまった
とりあえず試したのが上の等式を変形したこの形
gmBlackBoxX = gmGlyphOrigin.x - gmCellIncX
上の画像の関係が割りと怪しくなってるのでその関係を持ち出すのは正直意味無いと思うが他にリファレンスもないので頼ると横幅のサイズはgmBlackBoxXよりも小さくはならないのでまぁやってみる
知ってた(白目)
他にも手がないし・・・ってことで gmCellIncXだけを横幅として試してもみたがダメだった。
後ちょっとで出来そうな気もするがちょっと仕様がよくわからんようなものを使ってたく無いので別の手法で試します。
AA自動作成ツールを作る(みかん)
3年前にAAを自動で作成するツールを作ってバグバグなまま放置してたので腰を据えて作ろうと思う
その時に考えてた基本的なアルゴリズムが以下
1.画像を読み込む
2.画像を微分
3.フォントサイズを指定(文字で幅が変わらない等幅フォントとする)して画像を分割
4.文字のビット列を取得
5.分割した画像それぞれと複数の文字のビット列を比較して最も一致率の高かったものを出力する
win32APIのgetGlyphOutlineで文字のビット列を受け取っていたのですが正直面倒というか・・・
win32APIはあんまり使いたくないのでもっと便利なものがあれば使いたい
一応2年前の状態を張って置く
1と2にあたる部分が以下の画像
左が画像の読み込み部、右が微分して出力した画像
4にあたるのが以下の画像
これは「おやすみ」のビット列を読み込んで適当な文字に置き換えて出力している
上記二つを組み合わせて処理を行った結果が以下
下のが元画像
左がAAとして出力したもの 右が画像のビットマップを0と1で出力したもの
フォントサイズは2である
AAのほうはこんな小さいフォントなら文字とか関係なく元画像と同じように見えるに決まってるだろっていう突っ込みはさておき、画像右側に行くにつれて元画像との違いが出ている
バグだ
続いてフォントサイズ12で作ったもの
もうだめ
とりあえず今後の目標としては
・このブレを直す
・処理が重いので軽量化を目指す
の2点と締めくくっていた
なのでこれから頑張る
processingでとことんぷよぷよを作成した
processingにて「とことんぷよぷよ」を作成した
上の画像がそれ
実装期間は4日程、何気に時間を使ったのは回転処理とか。コードの4分の1は回転とかのキー操作でなんとか短くしたい
githubにコードを載せたけど正直書いたのが前過ぎてあんまり覚えてないしコードが汚い
もし良かったら遊んでみて欲しい
プラットフォームを作ったので将来的にぷよぷよAIとかもつくってみたいかも