LoginSignup
0
2

More than 1 year has passed since last update.

Pythonでクレしんチャレンジしてみた

Posted at

クレしんチャレンジとは

クレヨンしんちゃんのタイトルコール画面を、プログラミングで再現するというもの。
こちらの記事出他の方の作品もみることができますが、Pythonでチャレンジされている方がおられなかったのでやってみました。

使用ライブラリ

OpenCVを使う予定でしたが、日本語が使えないということで断念しPillowを使用しました。

プログラム

importと定義

ライブラリのインポートと、画像サイズや各カラー。
ピンクと黄色はタイトルコールのあのグラデーション、紫は文字です。
DIFFは、グラデーションを作るために使用します。グラデーションについて、詳しくは後述。

from PIL import Image, ImageDraw, ImageFont

SIZE = 100
PINK = (230, 143, 150, 0)
YEL = (255, 255, 0, 0)
DIFF = tuple(map(lambda x, y: (x - y) / SIZE / 3, YEL, PINK))
PUR = (192, 48, 192, 0)

イメージ作成

3:4の画面を作成しました。

pic = Image.new("RGB", (SIZE*4, SIZE*3), PINK)
draw = ImageDraw.Draw(pic)

この時の画像はこちら。

pink.png

グラデーション作成

上三分の一をピンク色にし、そこからグラデーションを開始しました。
grad変数はグラデーションの途中経過を入れるものです。最初はピンクですが、ループごとにDIFFを足していくことで徐々に黄色に近づけます。
なぜわざわざgradをarrに入れているかというと、毎回gradをintにしていたら色が変わらないからです。

grad = PINK
for i in range(SIZE, pic.size[1]):
    grad = tuple(map(lambda x, y: x + y, grad, DIFF))
    arr = tuple(map(lambda x: int(x), grad))
    for j in range(pic.size[0]):
        pic.putpixel((j, i), arr)

この時の画像はこちら。

grad.png

だいぶ雑なプログラムでしたが、もうそれっぽいですね。

文字入れ

まず、以下の関数を定義しました。

def putText(text, x, y, size):
    global draw, PUR
    draw.text(\
        (x, y),
        text,
        PUR,
        font=ImageFont.truetype(
            "フォントパスが入るゾ",
            size
        )
    )

次に、以下の三行で文字を追加しました。

putText("ライブラリのアップグレード", 20, 120, 25)
putText("いつの間にか溜まってるゾ", 45, 160, 25)
putText("ま        た", 128, 150, 10)

本当は文字位置を自動調整したり、ルビを自動でふったりしたかったですが、さすがに難しすぎるのでここでは断念します。

ここまで実行すると、下の画像が出来上がります。

title_call.png

これで完成です!

フルバージョン

最後に、フルバージョンを乗せておきます。

from PIL import Image, ImageDraw, ImageFont

def putText(text, x, y, size):
    global draw, PUR
    draw.text(\
        (x, y),
        text,
        PUR,
        font=ImageFont.truetype(
            "フォントパスが入るゾ",
            size
        )
    )

SIZE = 100
PINK = (230, 143, 150, 0)
YEL = (255, 255, 0, 0)
DIFF = tuple(map(lambda x, y: (x - y) / SIZE / 3, YEL, PINK))
PUR = (192, 48, 192, 0)

pic = Image.new("RGB", (SIZE*4, SIZE*3), PINK)
draw = ImageDraw.Draw(pic)

pic.save("pink.png")

grad = PINK
for i in range(SIZE, pic.size[1]):
    grad = tuple(map(lambda x, y: x + y, grad, DIFF))
    arr = tuple(map(lambda x: int(x), grad))
    for j in range(pic.size[0]):
        pic.putpixel((j, i), arr)
        
pic.save("grad.png")
        
putText("ライブラリのアップグレード", 20, 120, 25)
putText("いつの間にか溜まってるゾ", 45, 160, 25)
putText("ま        た", 128, 150, 10)

pic.save("title_call.png")

最後に

たまたま見かけたのでやってみましたが、楽しかったです。
もしPythonで挑戦される方いましたら、私の断念した文字位置自動調節と自動ルビふり機能挑戦してみてほしいです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2