Соотношение сторон изображения с использованием Reportlab в Python
Я хочу вставить изображение внутри кадра. Я нашел два способа сделать это:--2-->
- drawImage (self, image, x, y, width=None, height=None, mask=None, preserveAspectRatio=False, anchor= 'c')
- изображение (имя файла, ширина=нет, высота=нет)
мой вопрос: как я могу добавить изображение в рамку, сохраняя его пропорции?
from reportlab.lib.units import cm
from reportlab.pdfgen.canvas import Canvas
from reportlab.platypus import Frame, Image
c = Canvas('mydoc.pdf')
frame = Frame(1*cm, 1*cm, 19*cm, 10*cm, showBoundary=1)
"""
If I have a rectangular image, I will get a square image (aspect ration
will change to 8x8 cm). The advantage here is that I use coordinates relative
to the frame.
"""
story = []
story.append(Image('myimage.png', width=8*cm, height=8*cm))
frame.addFromList(story, c)
"""
Aspect ration is preserved, but I can't use the frame's coordinates anymore.
"""
c.drawImage('myimage.png', 1*cm, 1*cm, width=8*cm, preserveAspectRatio=True)
c.save()
2 ответов
вы можете использовать размер исходного изображения для вычисления его соотношения сторон, а затем использовать его для масштабирования целевой ширины, высоты. Вы можете обернуть это в функцию, чтобы сделать это многоразовый:
from reportlab.lib import utils
def get_image(path, width=1*cm):
img = utils.ImageReader(path)
iw, ih = img.getSize()
aspect = ih / float(iw)
return Image(path, width=width, height=(width * aspect))
story = []
story.append(get_image('stack.png', width=4*cm))
story.append(get_image('stack.png', width=8*cm))
frame.addFromList(story, c)
пример использования стека пикселей 248 x 70.png:
У меня была похожая проблема, и я думаю, что это работает:
image = Image(absolute_path)
image._restrictSize(1 * inch, 2 * inch)
story.append(image)
надеюсь, это поможет!