Центрирование повернутого изображения с использованием Reportlab - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь центрировать повернутое изображение на 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)

Пока что вот что я сделал:

  1. Расчет границ повернутого прямоугольника (так как он будет больше)
  2. С их помощью вычисляется положение центра изображения (размер / 2 - изображение / 2) для ширины и высоты.

Появляются две проблемы, которые я не могу объяснить:

  1. Переменная «a4» указана в точках, все остальное в пикселях. Если я изменю их на пиксели для расчета позиции (что логично, используя a4_pixels = [x * (100 / 75) for x in a4]). Расположение неверно для поворота на 0 градусов. Если я держу А4 в баллах, это работает ...?
  2. Если я изменю вращение, оно сломается еще больше.

Итак, мой последний вопрос: как я могу вычислить значения offset_x и offset_y, чтобы обеспечить его постоянство по центру независимо от вращения?

Спасибо! :)

1 Ответ

0 голосов
/ 07 мая 2018

Когда вы переводите холст, вы буквально перемещаете точку начала (0,0), и все операции рисования будут относительными к этому.

Итак, в приведенном ниже коде я переместил начало координат в середину страницы. Затем я повернул «страницу» и нарисовал изображение на «странице». Нет необходимости вращать изображение, так как его оси холста повернуты.

from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
from reportlab.lib.pagesizes import A4
from PIL import Image as PILImage
import requests

def main(rotation):
    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)
    # The image dimensions in cm
    width, height = img.size

    # now move the canvas origin to the middle of the page
    c.translate(A4[0] / 2, A4[1] / 2)
    # and rotate it
    c.rotate(rotation)
    # now draw the image relative to the origin
    c.drawImage(ImageReader(img), -width/2, -height/2, width, height, 'auto')

    c.restoreState()
    c.save()

if __name__ == '__main__':
    main(45)
...