お久しぶりですポカメです。久しぶりにCA触ったので記事書きます!
CAからしばらく離れていて、最近は年末の匿名絵系だけ参加するといった(去年は参加できなかった)感じです。夏休みに入り就活や勉強の合間に、ふとコメントアートの自動制作やってみたいなと思ったので作ってみました。
1/2空白や1/3空白を使いたい
他の方の自動制作ツールについてはあまり詳しくないのですが、基本的に全角幅のみのイメージ(違ったら教えてください)です。
今回は1/2空白,1/3空白を組み合わせて自動制作したいなーと思いました。アイデアとしては全角幅を6pxにして1/2空白を3px,1/3空白を2pxにする感じ。そうなると画像を縦6×行数、横6×臨界幅にすればいいです。
処理
画像を比率を保ったままサイズ変更と二値化して配列に入れる、縦6×行数、横6×臨界幅に合わなければ0(白)で埋める(Pillow、Numpy)
6行ずつ切り出し(ここでNumpyが便利)、文字と配列の対応表と比べて一番差が小さいもの(それぞれのマス目の数で正規化)を選ぶ。選んだ文字の横幅分だけ進める
これを繰り返すことで出力したいコメントアートができます
文字と配列の対応
ちなみに文字と配列の対応は力技ですw。一応載せときますが興味なければ読み飛ばしてください。
#文字と配列の対応表
TEMPLATE_DICT = {
"█": np.ones((6, 6), dtype=int),
" ": np.zeros((6, 6), dtype=int),
"▁": np.array([[0]*6, [0]*6, [0]*6, [0]*6, [0]*6, [1]*6]),
"▂": np.array([[0]*6, [0]*6, [0]*6, [0]*6, [1]*6, [1]*6]),
"▄": np.array([[0]*6, [0]*6, [0]*6, [1]*6, [1]*6, [1]*6]),
"▅": np.array([[0]*6, [0]*6, [1]*6, [1]*6, [1]*6, [1]*6]),
"▆": np.array([[0]*6, [1]*6, [1]*6, [1]*6, [1]*6, [1]*6]),
"◢": np.fliplr(np.tril(np.ones((6, 6), dtype=int))),
"◣":np.tril(np.ones((6, 6),dtype=int)),
"◥":np.triu(np.ones((6, 6), dtype=int)),
"◤":np.fliplr(np.triu(np.ones((6, 6), dtype=int))),
"▏":np.array([[1,0,0,0,0,0]]*6),
"▎":np.array([[1,1,0,0,0,0]]*6),
"▌":np.array([[1,1,1,0,0,0]]*6),
"▋":np.array([[1,1,1,1,0,0]]*6),
"▉":np.array([[1,1,1,1,1,0]]*6),
}
padded_templates = {}
for key, arr in TEMPLATE_DICT.items():#U+2002
new_key = f" {key}"
padded_arr = pad_array(arr,left=3,value=0)
padded_templates[new_key] = padded_arr
for key, arr in TEMPLATE_DICT.items():#U+2004
new_key = f" {key}"
padded_arr = pad_array(arr,left=2,value=0)
padded_templates[new_key] = padded_arr
for key, arr in TEMPLATE_DICT.items():#U+2004*2
new_key = f" {key}"
padded_arr = pad_array(arr,left=4,value=0)
padded_templates[new_key] = padded_arr
for key, arr in TEMPLATE_DICT.items():#U+2002+2004
new_key = f" {key}"
padded_arr = pad_array(arr,left=5,value=0)
padded_templates[new_key] = padded_arr
TEMPLATE_DICT.update(padded_templates)
結果
今回は38行横65文字で作ってみました。結果がこちら。
耳とかちょっと変な部分はあるけどシルエットははっきりわかるかな?少し手直ししたら自動制作かどうかわからないレベルになりそうでびっくりです。
ということでピカチュウ作ってみました。制作時間は1.445 secondsでした。処理早くするなら空白と2588については差が0なら確定させるとかがいいのかな?といっても38行なら困ることはないです
元画像は以下のリンクから
https://zukan.pokemon.co.jp/?word=%E3%83%94%E3%82%AB%E3%83%81%E3%83%A5%E3%82%A6&no_min=1&no_max=893
課題と今後について
課題としては
- まだ単色しか作れない
- 元画像の画質が荒いとサイズ変更の影響でガタガタになる
- 背景は白or透過でないと厳しい(thresholdをうまく調整するか画像加工ソフト使えばなんとか?)
レイヤー別に画像をなぞって絵をトレスすれば簡単にコメントアート作れるようになったのはいいですね
今の所、全体への配布予定はないです。個人的な用途で使っていこうと思います。
最後に
ということでCA自動制作ツール作ってみたよって記事でした。時間ないけど、久しぶりにコメントアート作りたくなった時なんかに便利かな?
最後まで読んでいただきありがとうございました。