You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.9 KiB

from datetime import datetime
import math
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
mirror = False
def rgb(r=0, g=None, b=None):
if g == None:
g = r
if b == None:
b = r
return "rgb(%d,%d,%d)" % (b*255, g*255, r*255)
#rotate round center
def rrc(tuple, center, angle):
sin = math.sin(angle)
cos = math.cos(angle)
tpl = (tuple[0] - center[0], tuple[1] - center[1])
tpl = tuple
if mirror:
cos = -cos
return (int(tpl[0] * sin + tpl[1] * cos + center[0]), int(-tpl[0] * cos + tpl[1] * sin + center[1]))
def draw_clock(size=(800, 480), pixelformat="RGBA", r=230, aliasing=None):
if aliasing != None:
size = (size[0] * aliasing, size[1] * aliasing)
r *= aliasing
image = Image.new(pixelformat, size)
#font = ImageFont.truetype(font="consola.ttf", size=40)
draw = ImageDraw.Draw(image)
now = datetime.now()
#draw watch face
center = (size[0] / 2, size[1] / 2)
for i12 in range(12):
for i5 in range(5):
angle = (i12 * 5 + i5) / 60 * 2 * math.pi
len = r * 0.85 if i5 == 0 else r * 0.95
thick = int((5 if i5 == 0 else 2) * r/180)
sin = math.sin(angle)
cos = math.cos(angle)
draw.line([(sin * len + center[0], cos * len + center[1]), (sin * r + center[0], cos * r + center[1])], fill=rgb(0.7), width=thick)
#draw hour pointer
base = r * 0.015
angle = (now.hour + (now.minute + now.second / 60) / 60) / 12 * 2 * math.pi + math.pi / 2
thick = 10*r/180
draw.line([rrc((+base, r * 0.2), center, angle), rrc((0, -r * 0.65), center, angle), rrc((-base, r * 0.2), center, angle)], fill=rgb(1), width=int(thick))
#draw minute pointer
base = r * 0.02
angle = (now.minute + now.second / 60) / 60 * 2 * math.pi + math.pi / 2
thick = 8*r/180
draw.line([rrc((+base, r * 0.2), center, angle), rrc((0, -r * 0.95), center, angle), rrc((-base, r * 0.2), center, angle)], fill=rgb(1), width=int(thick))
#draw second pointer
angle = (now.second + now.microsecond / 1000000) / 60 * 2 * math.pi / 2 + math.pi / 2
thick = 4*r/180
draw.line([rrc((0, r * 0.3), center, angle), rrc((0, -r * 0.8), center, angle)], fill=rgb(1, 0, 0), width=int(thick))
e_center = rrc((0, -r * 0.8), center, angle)
e_r = r * 0.06
draw.ellipse([(e_center[0] - e_r, e_center[1] - e_r), (e_center[0] + e_r, e_center[1] + e_r)], fill=rgb(1, 0, 0), outline=None)
e_center = center
e_r = r * 0.03
draw.ellipse([(e_center[0] - e_r, e_center[1] - e_r), (e_center[0] + e_r, e_center[1] + e_r)], fill=rgb(1, 0, 0), outline=None)
if aliasing != None:
image = image.resize((size[0] // aliasing, size[1] // aliasing))
return image
if __name__ == "__main__":
pil_image = draw_clock(pixelformat="RGB", aliasing=4)
pil_image.save("clock.png", format="png")