import json
import math
from PIL import Image, ImageDraw
def star_points(center, size):
center_x, center_y = center
outer_radius = size / 2
inner_radius = outer_radius * 0.4
points = []
for index in range(10):
angle = -math.pi / 2 + index * math.pi / 5
radius = outer_radius if index % 2 == 0 else inner_radius
point_x = center_x + radius * math.cos(angle)
point_y = center_y + radius * math.sin(angle)
points.append((point_x, point_y))
return points
def cross_points(center, size):
center_x, center_y = center
half_size = size / 2
arm = size / 3
left = center_x - arm / 2
right = center_x + arm / 2
top = center_y - half_size
bottom = center_y + half_size
upper_side = center_y - arm / 2
lower_side = center_y + arm / 2
return [
(left, top),
(right, top),
(right, upper_side),
(center_x + half_size, upper_side),
(center_x + half_size, lower_side),
(right, lower_side),
(right, bottom),
(left, bottom),
(left, lower_side),
(center_x - half_size, lower_side),
(center_x - half_size, upper_side),
(left, upper_side),
]
with open("coat_of_arms.json", "r", encoding="utf-8") as file:
description = json.load(file)
image = Image.new(
"RGB",
(800, 800),
"white",
)
draw = ImageDraw.Draw(image)
draw.rectangle(
(0, 0, 799, 799),
fill=description["background"],
)
border = description["border"]
border_width = border["width"]
for offset in range(border_width):
draw.rectangle(
(offset, offset, 799 - offset, 799 - offset),
outline=border["color"],
)
emblem = description["emblem"]
position = tuple(emblem["position"])
if emblem["shape"] == "circle":
radius = emblem["radius"]
draw.ellipse(
(
position[0] - radius,
position[1] - radius,
position[0] + radius,
position[1] + radius,
),
fill=emblem["color"],
)
else:
side = emblem["side"]
half_side = side / 2
draw.rectangle(
(
position[0] - half_side,
position[1] - half_side,
position[0] + half_side,
position[1] + half_side,
),
fill=emblem["color"],
)
for symbol in description["symbols"]:
position = tuple(symbol["position"])
size = symbol["size"]
if symbol["shape"] == "star":
points = star_points(position, size)
else:
points = cross_points(position, size)
draw.polygon(points, fill=symbol["color"])
image.save("narnia_shield.png")