Структуры данных

Какие данные будут использоваться в программе:

  1. Координаты одной конкретной надписи на меме: класс Point;
  2. Связь между изображением и всеми точками, где на нём будет размещаться текст: класс Meme;
  3. Набор размеченных мемов: словарь MEMES.

Координаты надписей

Чтобы создать мем, нужно подготовить исходное изображение и отметить на нём точки, в которые будет вставляться текст. Таких точек на каждом изображении может быть несколько. Каждая точка состоит из 2 координат: x (горизонтальная) и y (вертикальная).

Пусть координата y будет числом, а координата x - либо числом, либо None. Если x is None, то текст нужно будет автоматически отцентрировать по горизонтали.

from dataclasses import dataclass
from typing import Optional


@dataclass
class Point:
    x: Optional[int]
    y: int

Мем

Мем можно представить в виде имени файла с изображением и набора «слотов» для надписей.

@dataclass
class Meme:
    filename: str
    slots: list[Point]

Список мемов

Для начала будем использовать 2 изображения: кот-программист и афроамериканец-суперхакер.

progracat

afrohacker

Поместим их в директорию img/ и свяжем с кодом вот так:

MEMES = {
    'Coding cat': Meme(
        'img/coding_cat.jpg',
        [
            Point(None, 15),
            Point(None, 250)
        ]
    ),
    'Hackerman': Meme(
        'img/hackerman.jpg',
        [
            Point(None, 20)
        ]
    ),
}

Конечно, по уму было бы убрать эту структуру данных во внешнее хранилище, хотя бы в json-файл, но это раздует код и отвлечёт ваше внимание от самого главного. Поэтому при желании можете сделать это самостоятельно, ну а мы здесь напишем простой и топорный код в одном модуле :)