クレしんチャレンジとは
クレヨンしんちゃんのタイトルコール画面を、プログラミングで再現するというもの。
こちらの記事出他の方の作品もみることができますが、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)
この時の画像はこちら。
グラデーション作成
上三分の一をピンク色にし、そこからグラデーションを開始しました。
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)
この時の画像はこちら。
だいぶ雑なプログラムでしたが、もうそれっぽいですね。
文字入れ
まず、以下の関数を定義しました。
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)
本当は文字位置を自動調整したり、ルビを自動でふったりしたかったですが、さすがに難しすぎるのでここでは断念します。
ここまで実行すると、下の画像が出来上がります。
これで完成です!
フルバージョン
最後に、フルバージョンを乗せておきます。
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で挑戦される方いましたら、私の断念した文字位置自動調節と自動ルビふり機能挑戦してみてほしいです。