Загрузка данных


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