Я пытаюсь центрировать повернутое изображение на Reportlab, но у меня возникают проблемы с использованием правильного расчета для места размещения.
Вот текущий код:
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from PIL import Image as PILImage
import requests
import math
def main(rotation):
# create a new PDF with Reportlab
a4 = (595.275590551181, 841.8897637795275)
c = canvas.Canvas('output.pdf', pagesize=a4)
c.saveState()
# loading the image:
img = requests.get('https://i.stack.imgur.com/dI5Rj.png', stream=True)
img = PILImage.open(img.raw)
width, height = img.size
# We calculate the bouding box of a rotated rectangle
angle_radians = rotation * (math.pi / 180)
bounding_height = abs(width * math.sin(angle_radians)) + abs(height * math.cos(angle_radians))
bounding_width = abs(width * math.cos(angle_radians)) + abs(height * math.sin(angle_radians))
a4_pixels = [x * (100 / 75) for x in a4]
offset_x = (a4_pixels[0] / 2) - (bounding_width / 2)
offset_y = (a4_pixels[1] / 2) - (bounding_height / 2)
c.translate(offset_x, offset_y)
c.rotate(rotation)
c.drawImage(ImageReader(img), 0, 0, width, height, 'auto')
c.restoreState()
c.save()
if __name__ == '__main__':
main(45)
Пока что вот что я сделал:
- Расчет границ повернутого прямоугольника (так как он будет больше)
- С их помощью вычисляется положение центра изображения (размер / 2 - изображение / 2) для ширины и высоты.
Появляются две проблемы, которые я не могу объяснить:
- Переменная «a4» указана в точках, все остальное в пикселях. Если я изменю их на пиксели для расчета позиции (что логично, используя
a4_pixels = [x * (100 / 75) for x in a4]
). Расположение неверно для поворота на 0 градусов. Если я держу А4 в баллах, это работает ...?
- Если я изменю вращение, оно сломается еще больше.
Итак, мой последний вопрос: как я могу вычислить значения offset_x
и offset_y
, чтобы обеспечить его постоянство по центру независимо от вращения?
Спасибо! :)