На самом деле вам не нужно писать Python, вы можете просто сделать это в Терминале с помощью ImageMagick , используя «Перспективное преобразование» , например:
magick cover.png -virtual-pixel none -distort perspective "0,0 96,89 %w,0 325,63 %w,%h 326,522 0,%h 96,491" template.png +swap -flatten result.png
Глядя на параметры для преобразования перспективы, можно надеяться, что есть 4 пары координат, по одной паре для каждого угла преобразования, показывающего как расположение источника отображается в выходном изображении.
Итак, верхний левый угол обложки (0,0) сопоставляется с верхним левым краем пустой области в шаблоне (96,89). ). Верхний правый угол обложки (width, 0) отображается в верхнем правом углу пустой области шаблона (325,63). Нижний правый угол обложки (ширина, высота) отображается в правом нижнем углу пустой области шаблона (326,522). Нижний левый угол обложки (0, высота) отображается в левом нижнем углу пустой области шаблона (96 491).
Если вы используете старую версию 6 ImageMagick , замените magick
на convert
.
Обратите внимание, что если вы действительно хотите сделать это в Python, здесь есть привязка Python, называемая wand
. Я не очень опытен с wand
, но это, кажется, эквивалентно:
#!/usr/bin/env python3
from itertools import chain
from wand.color import Color
from wand.image import Image
with Image(filename='cover.png') as cover, Image(filename='template.png') as template:
w, h = cover.size
cover.virtual_pixel = 'transparent'
source_points = (
(0, 0),
(w, 0),
(w, h),
(0, h)
)
destination_points = (
(96, 89),
(325, 63),
(326, 522),
(96, 491)
)
order = chain.from_iterable(zip(source_points, destination_points))
arguments = list(chain.from_iterable(order))
cover.distort('perspective', arguments)
# Overlay cover onto template and save
template.composite(cover,left=0,top=0)
template.save(filename='result.png')