ドット絵をClaude Codeに描かせている|画像生成のほうが速いのに、それでもコードで描く理由

AIにピクセルアートを描かせる話。ただし画像生成ではなく、Pythonのコードを書かせる方法です。正直、画像生成のほうが圧倒的に速いし上手い。それでもコードで持つと、引数ひとつで状態が変わり、動画にもWebアプリにも埋め込めます。実際にどこまで下手なのかも全部見せます。

ドット絵をClaude Codeに描かせている

YouTube Shorts用に、ドット絵のキャラクターが喋る動画を作っています。「やさしいIT」という初心者向けの解説シリーズで、イエティ君というキャラクターがパスワードやWi-Fiの話をする、40秒くらいのやつです。

問題は、動画1本につきドット絵が十数個要ることでした。鍵、錠前、雲、封筒、釣り針、キーキャップ。使い回せるものもありますが、テーマが変われば新しいものが要ります。

これを全部Aseprite(=ドット絵専用のお絵かきソフト)で1ドットずつ打つのは、正直しんどい。

そこでClaude Code(=ターミナルで動くAIのプログラミング相棒)に描かせることにしました。

先に結論を言っておきます。1枚の絵が欲しいだけなら、画像生成AIに描かせたほうが圧倒的に速いし、圧倒的に上手いです。 それでもコードで描いています。理由は最後まで読んでもらえれば分かります。


🎨 まず誤解を潰しておく:画像生成の話ではありません

「AIにドット絵を描かせる」と聞くと、たぶん多くの人がこれを想像します。

プロンプトを打つ → 絵が出てくる

やっているのはそれではありません。 AIに書かせているのは絵ではなく、絵を描くPythonのコードです。

出てきたコードを実行すると、絵になります。つまり手元に残るのは画像ファイルではなく、画像を生み出すプログラムのほうです。

この違いが、記事の最後で効いてきます。


🧱 仕組み:ドット絵は「描く」んじゃなくて「座標を置く」

ドット絵をAIに頼めるのは、単純な図形の組み合わせに分解できるからです。うまいかどうかは別として、頼む形にはしやすい。

手順は3つだけです。

  1. 32×28マスくらいの小さいキャンバスに、四角や丸を数個置く
  2. それをNEAREST(=拡大するとき、色を混ぜずにドットをそのまま大きくする方式)で8倍にする
  3. 塗った部分の外周1マスを、輪郭として塗る

3つ目の輪郭は毎回やるので、_pixel()という共通の関数にまとめてあります。下のコードの最後の行がそれです。

これだけでドット絵になります。実際のコードがこれです。

@lru_cache(maxsize=None)
def _pc(scale=8, cracked=False):
    def fn(d):
        d.rectangle([2,2,30,20],  fill=WHITE)   # モニタの外枠
        d.rectangle([5,5,27,17],  fill=SCR)     # 画面
        d.rectangle([13,21,19,23],fill=WHITE)   # 支柱
        d.rectangle([6,24,26,26], fill=WHITE)   # 台座
        if cracked:                              # ヒビを入れる場合だけ
            d.line([(18,5),(13,10),(17,11),(11,17)], fill=RED, width=2)
    return _pixel(fn, 32, 28, scale)

やっていることは、四角を4つ置いて、cracked=Trueのときだけ赤い線を1本足す、それだけです。rectangle([2,2,30,20])は「左上(2,2)から右下(30,20)まで四角を塗る」という意味で、絵を描く技術というより、どこに四角を置くかの指定になっています。

位置が言葉で書ける以上、AIに頼みやすい仕事です。ただし簡単なのは、この四角4つで済むレベルの形だけという条件が付きます(後で嫌というほど分かります)。

こうして描き溜まったのが、これ。

コードで描いたドット絵のアイコン群

雲、ドライブ、封筒、フィルム、写真、鍵、錠前、スマホ、モニタ。全部この方式です。

描き溜まってくると、これが効いてきます。台本29本に対してカードのファイルは28個ありますが、そのうち10個は共通の土台を読み込むだけで済んでいて、1本あたり19行しかありません。新しい回のたびに絵を用意し直しているわけではない、ということです。

ちなみに一番右は「釣り針」のつもりで描かせたものです。どう見ても下向き矢印ですね。この話も後でします。


🔑 コードで持つと何が嬉しいのか

画像ファイルではなくコードで持つと、こうなります。

引数ひとつで状態とサイズが変わる

左から順に説明します。

呼び出し 出てくる絵
_pc() 普通のモニタ
_pc(cracked=True) 画面にヒビが入ったモニタ
_lock() 閉じた錠前(黄色)
_lock(opened=True) 開いた錠前(赤くなる)
_lock(4) 小さい錠前
_lock(12) 3倍の錠前(ドットが潰れない)

新しく描き足したものは1枚もありません。 モニタは_pc()、錠前は_lock()という関数がそれぞれ1つあるだけで、渡す値を変えているだけです。

これを画像ファイルとして持っていると、ヒビ入り用に1枚、開いた錠前用に1枚、サイズ違いにさらに数枚、と別ファイルが増えていきます。しかも拡大するとドットがぼやけます。

さらに効くのがアニメーションです。「1秒後に錠前が開く」「ゲージがだんだん溢れる」「キーが沈む」といった動きは、時間tを受け取って絵を返す関数を1個足すだけで作れます。

def card_at(screen, t):     # t = そのシーンに入ってからの経過秒
    ...

動画は結局、1秒間に何十枚も絵を差し替えているだけなので、絵が関数になっていれば、動きは「時間に応じて数字を変える」だけで書けます。 もちろんタイミング調整や書き出しの手間は別にかかりますが、動きのために新しい素材を用意する必要はありません。

そして地味に大きいのが、HTMLにそのまま埋められること。コードで描ける絵は、動画にもWebアプリにも同じ考え方で持っていけます。用途ごとに素材を作り直す必要がありません。

念のため補足すると、ここで比べているのはAIが吐き出したPNG画像1枚とコードの差です。Asepriteのファイルやレイヤー付きのデータを自分で管理しているなら、そちらでもある程度は使い回せます。


😇 で、実際どこまで下手なのか

このイエティ君、完成形はもう出来ています。ただ、それを一切見せない状態でClaude(=この記事を一緒に書いているAI)に「イエティを描いて」と頼んだら何が出てくるのか、試してみました。5パターンです。

AIが初見で描いたイエティ5種

1匹もイエティに見えません。

共通してやらかしているのが3つあります。

  • 毛が無い。イエティは毛むくじゃらのはずなのに、全部つるつるの丸
  • 赤い口が鼻に見える。位置が中央すぎる
  • 影を入れると服の帯に見える

つまりAIは「32×28に四角を置く」ことはできても、イエティらしさを知らないわけです。


🔁 フィードバックを1回返すとどうなるか

そこで完成形を見せて、直すべき点を6つ伝えました。

  1. 顔と体を色で分ける(顔は薄い青、体は白)
  2. 輪郭をギザギザにして毛を出す
  3. 体の内側に陰影のドットを散らす
  4. シルエットを台形・山型にする
  5. 手足は細い線を数本にして指に見せる
  6. 頬にピンクを置く

出てきたのがこれです。

フィードバック1回後

だいぶ生き物になりました。 顔と体が分かれ、頬にピンクが乗り、目が濃紺の四角になりました。

でも今度は富士山になりました。

  • シルエットが三角すぎる(本物はもっともこもこした台形)
  • 底が直線で塞がっている
  • ギザギザが階段状で機械的
  • 顔が大きすぎて六角形っぽい
  • 手が体の白に埋もれて見えない

1回のフィードバックでは、まだこの距離です。


📏 一発目 → 1回直す → 完成形

3段階を並べるとこうなります。左が一発目の5種、真ん中がフィードバック1回後、右が完成形です。

3段階の比較

右端との差が、そのままかかる手間です。

実際に完成形まで持っていったときは、こうでした。

  • 参考画像を渡した(言葉だけでは越えられない壁がある)
  • かなりの数の往復をした
  • てこずったのは特定の部分ではなく全部

「AIに頼んだら一瞬でできました」ではありません。そこそこ粘る作業です。


⚖️ で、どっちを選ぶべきか

画像生成AI コードで描く
速さ ⭕️ 圧倒的に速い ❌ 何往復もする
上手さ ⭕️ 上手い ❌ 下手
状態違い ❌ 作り直し ⭕️ 引数ひとつ
サイズ変更 ❌ ぼやける ⭕️ 潰れない
アニメ ❌ 別で作る ⭕️ 関数を1つ足すだけ
埋め込み 画像として貼る ⭕️ HTML・動画・アプリに同じ形で
修正 作り直し ⭕️ 数字を1つ書き換える

上2行を見れば、画像生成の圧勝です。速いし上手い。1枚ぽっきり必要なだけなら、迷わずそっちを使うべきです。

コードで描く価値は下5行にあります。一度コードになると、その後の汎用性が上がる。同じ絵を色違い・サイズ違い・状態違い・動きつきで何十回も使う場合、最初の遅さを回収できます。

ぼくの場合は、動画を1本作るたびに同じアイコンを別サイズ・別状態で何度も使うので、後者を選んでいます。遅くて下手なほうを選んでいるのは、後で楽をするためです。


🛠 やってみたい人向けのメモ

必要なのはPythonとPillow(=Pythonで画像を扱うライブラリ)だけです。

pip install pillow

Claude Codeに頼むときのコツは3つでした。

  • キャンバスサイズを先に決めて伝える(「32×28で」)。サイズを言わないと妙に大きい絵を描こうとして崩れます
  • 色を先に定義しておく。パレットを渡さないと、絵ごとに色がバラバラになって統一感が消えます
  • 一発で完成を狙わない。出てきたものを見て、具体的に何が違うかを言葉で返すほうが速いです。「もっとかわいく」ではなく「輪郭をギザギザにして」

そして繰り返しますが、参考画像は早めに渡したほうがいいです。言葉だけで形を伝えるのは、思っているよりずっと難しい。


まとめ

  • ドット絵は「絵を描く」のではなく「小さいマス目に座標を置く」作業なので、AIがコードとして書ける
  • ただし画像生成のほうが速いし上手い。1枚だけ欲しいならそっちを使うべき
  • それでもコードで持つと、引数ひとつで状態・サイズが変わり、アニメも作れて、HTMLにも動画にもアプリにも埋め込める
  • 実際にやると参考画像が要るし、かなりの往復が必要。一瞬では終わらない

速さを買うなら画像生成。使い回しを買うならコード。それだけの話でした。

💡 この記事の内容を、業務に組み込んでみませんか?

福岡・東京の二拠点で、中小企業の AI 導入支援・業務自動化・技術顧問をやっています。
議事録の自動化、業務スクリプト、システム開発まで。
30分で「何から始めるべきか」を一緒に整理します。

© 2022-2025 infoHiroki. All rights reserved.