DiiiT blog

自作のPythonプログラムやExcelシート公開用

月の満ち欠け画像作成プログラム

moon.py - Google ドライブ

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 を左右反転させる。

 

moon03.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)