From bd2497f9f8db239603b855fe4f17180e907a7954 Mon Sep 17 00:00:00 2001 From: Florin Tobler Date: Thu, 28 Jul 2022 16:24:40 +0200 Subject: [PATCH] clock with pillow --- clock_pillow.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 clock_pillow.py diff --git a/clock_pillow.py b/clock_pillow.py new file mode 100644 index 0000000..865b27d --- /dev/null +++ b/clock_pillow.py @@ -0,0 +1,70 @@ +from datetime import datetime +import math + +from PIL import Image +from PIL import ImageDraw +from PIL import ImageFont + + +def rgb(r=0, g=None, b=None): + if g == None: + g = r + if b == None: + b = r + return "rgb(%d,%d,%d)" % (r*255, g*255, b*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 + return (int(tpl[0] * sin + tpl[1] * cos + center[0]), int(tpl[1] * sin - tpl[0] * cos + center[1])) + + +def draw_clock(size=(800, 480), pixelformat="RGBA", r=210, mirror=False): + 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.93 if i5 == 0 else r * 0.97 + thick = 5 if i5 == 0 else 2 + 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 + 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) + + return image + +if __name__ == "__main__": + pil_image = draw_clock(pixelformat="RGB") + pil_image.save("clock.png", format="png") \ No newline at end of file