Pillow(PIL)
前回、Pillow(PIL)で四角形や多角形、丸、円弧などの図形を描く方法を紹介しました。
今回はPillow(PIL)を使ってチェッカーパターン(格子柄)を作成する方法を紹介します。
それでは始めていきましょう。
プログラム全体
まずはプログラム全体をお見せします。
from PIL import Image, ImageDraw
figure_size = [800, 600]
checker_size = 20
color_flag = 0
horizontal_list = [i * checker_size for i in range(int(figure_size[0]/checker_size))]
vertical_list = [i * checker_size for i in range(int(figure_size[1]/checker_size))]
if len(vertical_list) % 2 != 0:
vertical_list = vertical_list[:-1]
img = Image.new("RGB", (int(horizontal_list[-1]), int(vertical_list[-1])), (255, 255, 255))
draw = ImageDraw.Draw(img)
for i in range(len(horizontal_list)-1):
for j in range(len(vertical_list)-1):
if color_flag == 0:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(0, 0, 0))
color_flag = 1
elif color_flag == 1:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(255, 255, 255))
color_flag = 0
img.save("test.png")
今回はそれほど長くないので自己関数にはしていません。
ということで上から解説していきます。
ライブラリのインポートと設定項目
今回使用するライブラリはPILだけです。
from PIL import Image, ImageDraw
設定項目としては画像サイズ(figure_size、ピクセルで指定)、チェックのサイズ(checker_size、ピクセルで指定)、白黒のパターン(0か1)の3つです。
figure_size = [800, 600]
checker_size = 20
color_flag = 0
白黒のパターンは格子柄の最初の1つ目が白か黒かで全体が決まるので、反転させたいときに使います。
チェックの点の取得
次にチェックの点の取得を行います。
チェックの点とは格子の一区画を決める際の角の点のことです。
horizontal_list = [i * checker_size for i in range(int(figure_size[0]/checker_size))]
vertical_list = [i * checker_size for i in range(int(figure_size[1]/checker_size))]
if len(vertical_list) % 2 != 0:
vertical_list = vertical_list[:-1]
横方向と縦方向での角の点を取得するには、画像サイズからチェックのサイズを割り算して、何点あるかを計算します。
ただし画像サイズとチェックのサイズによっては小数になってしまいますので、強制的に整数(int型)にします(int(figure_size[0]/checker_size)とint(figure_size[1]/checker_size))。
「if len(vertical_list) % 2 != 0:」の部分は行の数が奇数になってしまうと、次の列も同じパターンとなってしまうため、行が奇数の場合は1行削除して偶数にしています。
チェッカーパターンの出力
次にチェッカーパターンの出力を行なっていきます。
img = Image.new("RGB", (int(horizontal_list[-1]), int(vertical_list[-1])), (255, 255, 255))
draw = ImageDraw.Draw(img)
for i in range(len(horizontal_list)-1):
for j in range(len(vertical_list)-1):
if color_flag == 0:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(0, 0, 0))
color_flag = 1
elif color_flag == 1:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(255, 255, 255))
color_flag = 0
img.save("test.png")
まず背景が白の描写エリアを作成し、ImageDrawオブジェクトに渡します。
img = Image.new("RGB", (int(horizontal_list[-1]), int(vertical_list[-1])), (255, 255, 255))
draw = ImageDraw.Draw(img)
横の点のリスト(horizontal_list)と縦の点のリスト(vertical_list)を順番に取得していきます。
for i in range(len(horizontal_list)-1):
for j in range(len(vertical_list)-1):
color_flagによって条件分岐し、前のcolor_flagが0だった場合は黒の四角形を、1だった場合は白の四角形を描写します。
if color_flag == 0:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(0, 0, 0))
color_flag = 1
elif color_flag == 1:
draw.rectangle((horizontal_list[i], vertical_list[j], horizontal_list[i+1],vertical_list[j+1]), fill=(255, 255, 255))
color_flag = 0
最後に出力して完了です。
img.save("test.png")
出力結果
例えば「figure_size = [800, 600]、checker_size = 50, color_flag = 0」で出力するとこんな感じのチェッカーパターンが得られます。
チェッカーパターンを反転させるために「color_flag = 1」とするとこう変わります。
また「figure_size = [800, 600]、checker_size = 10, color_flag = 0」とするとこんな感じに。
「figure_size = [800, 600]、checker_size = 100, color_flag = 0」とするとこんな感じになります。
次回はmatplotlibを使って乱数表を出力するプログラムを紹介します。
ではでは今回はこんな感じで。
コメント