AA自動作成ツール(途中)

前回AA作成ツールを修正すると書き、この記事を書くまで試行錯誤をしていた。

今回はその中身を書いていく

 

前回までのはC言語で作成していた。AA化のアルゴリズム自体に不備は無かったんだけど画像を読み込むときとか十分に大きく取った配列に画像を読み込むとかいう変なことをしてたので可変長配列を扱いやすいC++で書き直した。

それで書き直すついでにアルゴリズムの手順ひとつひとつを関数化してどこが問題になってるか原因をわかりやすくした。

 

特定できた原因は

・GetGlyphOutline関数

これだ。

 

これは与えた文字のビットマップを返してくれるwin32apiで用意されている関数なんだけど結構いろんな記事でバグがー、罠がーといわれている。私も例に漏れずかかってしまった。

 

帰ってくる処理結果は以下のような図になる。

GetGlyphOutline関数のフォント位置 様より勝手に参照

 

f:id:akikanR:20170603193907j:plain

 

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よりも小さくはならないのでまぁやってみる

 

f:id:akikanR:20170603214924p:plain

知ってた(白目)

他にも手がないし・・・ってことで gmCellIncXだけを横幅として試してもみたがダメだった。

後ちょっとで出来そうな気もするがちょっと仕様がよくわからんようなものを使ってたく無いので別の手法で試します。

 

AA自動作成ツールを作る(みかん)

3年前にAAを自動で作成するツールを作ってバグバグなまま放置してたので腰を据えて作ろうと思う

 

その時に考えてた基本的なアルゴリズムが以下


1.画像を読み込む
2.画像を微分
3.フォントサイズを指定(文字で幅が変わらない等幅フォントとする)して画像を分割
4.文字のビット列を取得
5.分割した画像それぞれと複数の文字のビット列を比較して最も一致率の高かったものを出力する

 

win32APIのgetGlyphOutlineで文字のビット列を受け取っていたのですが正直面倒というか・・・

win32APIはあんまり使いたくないのでもっと便利なものがあれば使いたい

 

一応2年前の状態を張って置く

1と2にあたる部分が以下の画像

sample2.jpg

左が画像の読み込み部、右が微分して出力した画像

 

4にあたるのが以下の画像
これは「おやすみ」のビット列を読み込んで適当な文字に置き換えて出力している
sample1.png

 


上記二つを組み合わせて処理を行った結果が以下

下のが元画像
bildBefore.png


左がAAとして出力したもの 右が画像のビットマップを0と1で出力したもの

フォントサイズは2である
無題

AAのほうはこんな小さいフォントなら文字とか関係なく元画像と同じように見えるに決まってるだろっていう突っ込みはさておき、画像右側に行くにつれて元画像との違いが出ている

バグだ

続いてフォントサイズ12で作ったもの
bild1.png
もうだめ

 

とりあえず今後の目標としては
・このブレを直す
・処理が重いので軽量化を目指す
の2点と締めくくっていた

 

なのでこれから頑張る

processingでとことんぷよぷよを作成した

processingにて「とことんぷよぷよ」を作成した



tokopuyo.png


上の画像がそれ
実装期間は4日程、何気に時間を使ったのは回転処理とか。コードの4分の1は回転とかのキー操作でなんとか短くしたい

githubにコードを載せたけど正直書いたのが前過ぎてあんまり覚えてないしコードが汚い
もし良かったら遊んでみて欲しい


プラットフォームを作ったので将来的にぷよぷよAIとかもつくってみたいかも