月の満ち欠け画像作成プログラム
pictureフォルダーに moon00.png から moon29.png まで月齢0~29のPNG画像を作るpython3.9プログラム。pillowのインストールが必要。
楕円を描くために math を宣言。
Image, ImageDraw, ImageOps も宣言
moon00.png 月齢0(新月)は黒色の円、これは外の黒フチの分だけ大きめ。
moon07.png 月齢7(上弦の月)は右半分の黄色の半円。
moon00.png ~ moon06.png 月齢1~6は、月齢6から1へ順に上弦の月を黒色の楕円で塗りつぶす。
ここで改めて上弦の月に戻す。
moon08.png ~ moon14.png 月齢8~14は上弦の月を黄色の楕円で塗りつぶす。
moon15.png 月齢15(満月)は黄色の円。
moon16.png ~ moon29.png 月齢16~29はここまで作った moon14.png ~ moon01.png を左右反転させる。
-=- =-= -=- =-= -=- =-=
import math
from PIL import Image, ImageDraw, ImageOps
moonmaxday = 29.53 # 月齢上限
xymax = 256 # 画像サイズ
img = Image.new('RGBA', (xymax, xymax), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
margin = 16 # 黄色部分の余白
radius = xymax / 2 - margin # 黄色部分の半径
linewid = 4 # 外円の太さ
# 新月(月齢00)
draw.ellipse([(margin - linewid, margin - linewid),(xymax - margin + linewid , xymax - margin + linewid )], fill=(0, 0, 0))
img.save("picture/moon00.png")
# 上弦(月齢07)
draw.chord([(margin, margin),(xymax - margin, xymax - margin)], start=-90, end=90, fill=(255, 255, 0), outline=(255, 255, 0))
img.save("picture/moon07.png")
# 月齢01~06
for i in range(1,7):
j = 7 - i
moonratio = j / moonmaxday
cosmoon = math.cos(moonratio * 2 * math.pi)
leftside = radius * (1 - cosmoon)
rightside = 2 * radius - leftside
draw.ellipse([(margin + leftside , margin), (margin + rightside , margin + 2*radius )], fill=(0, 0, 0))
filename = "picture/moon" + "{0:02d}".format(j) + ".png"
img.save(filename)
# 再び上弦を描く
draw.chord([(margin, margin),(xymax - margin, xymax - margin)], start=-90, end=90, fill=(255, 255, 0), outline=(255, 255, 0))
# 月齢(08~14)
for i in range(8,15):
moonratio = i / moonmaxday
cosmoon = math.cos(moonratio * 2 * math.pi)
rightside = radius * (1 - cosmoon)
leftside = 2 * radius - rightside
draw.ellipse([(margin + leftside , margin), (margin + rightside , margin + 2*radius )], fill=(255, 255, 0))
filename = "picture/moon" + "{0:02d}".format(i) + ".png"
img.save(filename)
# 満月(月齢15)
draw.ellipse([(margin, margin),(xymax - margin, xymax - margin)], fill=(255, 255, 0))
img.save("picture/moon15.png")
# 月齢(16~29) 月齢14~01を左右反転
for i in range(16,30):
image_path = "picture/moon" + "{0:02d}".format(30-i) + ".png"
img = Image.open(image_path)
img = ImageOps.mirror(img)
filename = "picture/moon" + "{0:02d}".format(i) + ".png"
img.save(filename)