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")