Sulla base della domanda Create PDF with (resized) PNG images using Pycairo - rescaling Surface issue ho cercato di creare codice che ridimensiona e pone un'immagine in una posizione specifica, come mostrato nel seguente codice (in questo caso, ad esempio, le immagini dovrebbero apparire "over" rettangoli sottostanti). Tuttavia, non riesco a far apparire l'immagine nelle posizioni corrette.pyCairo: come ridimensionare e posizionare un'immagine?
Mi piacerebbe sapere cosa devo cambiare, al fine di bilanciare entrambi e posizionare un'immagine correttamente.
import cairo
if not cairo.HAS_PDF_SURFACE:
raise SystemExit('cairo was not compiled with PDF support')
def draw_image(ctx, image, top, left, height, width):
"""Draw a scaled image on a given context."""
image_surface = cairo.ImageSurface.create_from_png(image)
# calculate proportional scaling
img_height = image_surface.get_height()
img_width = image_surface.get_width()
width_ratio = float(width)/float(img_width)
height_ratio = float(height)/float(img_height)
scale_xy = min(height_ratio, width_ratio)
# scale image and add it
ctx.save()
ctx.scale(scale_xy, scale_xy)
ctx.translate(left, top)
ctx.set_source_surface(image_surface)
ctx.paint()
ctx.restore()
def draw_box(ctx, left, top, width, height):
"""Draw a box on a given context."""
ctx.rectangle(left, top, width, height)
ctx.set_source_rgb(1, 1, 1)
ctx.fill()
ctx.rectangle(left, top, width, height)
ctx.set_source_rgb(0, 0, 0)
ctx.stroke()
# A4 Page (in points)
surface = cairo.PDFSurface("box.pdf", 595, 842)
context = cairo.Context(surface)
# sizes (in points)
height = 250
width = 180
margin = 20
# draw boxes
draw_box(context, margin, margin, width, height)
draw_box(context, margin + width, margin + height, width, height)
# draw images - SHOULD be superimposed over rectangles, but are NOT
image = "hello.png"
draw_image(context, image, margin, margin, height, width)
draw_image(context, image, margin + height, margin + width, height, width)
è improbabile per ottenere buone risposte perché la gente non può semplicemente eseguire questo codice per testarlo. Si prega di aggiornarlo con un autonomo esempio, se possibile (e il collegamento a qualsiasi moduli/immagini/ecc sono necessari per eseguirlo) – agf
Attendere. Tu * INSTALLATO * PyCairo ?? Impossibile. – batman
@agf - In realtà questo è uno script autonomo ... quali problemi avete incontrato quando si cerca di farlo funzionare? L'unico modulo necessario è cairo. – Derek