16

フレーム内に画像を挿入したい。これを行うには2つの方法があります。

  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()
4

2 に答える 2

52

元の画像のサイズを使用してアスペクト比を計算し、それを使用してターゲットの幅と高さをスケーリングできます。これを関数にまとめて、再利用可能にすることができます。

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ピクセルのstack.pngを使用した例:

ここに画像の説明を入力してください

于 2011-03-16T16:53:38.793 に答える
14

私は同様の問題を抱えていました、そして私はこれがうまくいくと思います:

   image = Image(absolute_path)
   image._restrictSize(1 * inch, 2 * inch)
   story.append(image)

これがお役に立てば幸いです。

于 2013-06-21T10:09:33.503 に答える