使用Python中的Reportlab的图像宽高比

cit*_*itn 11 python pdf image reportlab

我想在一个框架内插入一个图像.我发现了两种方法:

  1. drawImage(self,image,x,y,width = None,height = None,mask = None,preserveAspectRatio = False,anchor ='c')
  2. 图像(文件名,宽度=无,高度=无)

我的问题是:如何在保留其宽高比的同时在帧中添加图像?

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()
Run Code Online (Sandbox Code Playgroud)

sam*_*ias 37

您可以使用原始图像的大小来计算其纵横比,然后使用它来缩放目标宽度和高度.您可以将其包装在函数中以使其可重用:

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)
Run Code Online (Sandbox Code Playgroud)

使用248 x 70像素stack.png的示例:

在此输入图像描述


Vla*_*lad 13

我有类似的问题,我认为这有效:

   image = Image(absolute_path)
   image._restrictSize(1 * inch, 2 * inch)
   story.append(image)
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!