2011-03-16 12 views
8

Chcę wstawić obraz do ramki. I znaleziono dwa sposoby, aby to zrobić:Proporcje obrazu za pomocą Reportlab w języku Python

  1. drawImage (samo, obraz, X, Y, szerokość = None, wysokość = None, maska ​​= None, preserveaspectratio = False, kotwica = 'c')
  2. obrazu (nazwa pliku, szerokość = brak, wysokość = brak)

Moje pytanie brzmi: jak mogę dodać obraz w ramce przy zachowaniu proporcji?

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

Odpowiedz

27

Możesz użyć rozmiaru oryginalnego obrazu do obliczenia współczynnika kształtu, a następnie użyć go do skalowania docelowej szerokości, wysokości. Można to zawinąć w funkcji, aby to wielokrotnego użytku:

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) 

przykład za pomocą stack.png 248 x 70 pikseli:

enter image description here

+0

Dziękujemy za obejście tego problemu. Mam nadzieję, że ktoś doda to do API. – citn

+0

To jest najlepsza odpowiedź na to pytanie. Są podobne pytania, które powinniśmy włączyć do tego. – jimh

8

miałem podobny problem i myślę, że to działa :

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

Mam nadzieję, że to pomoże!

Powiązane problemy