2011-08-22 55 views
8

基于Create PDF with (resized) PNG images using Pycairo - rescaling Surface issue这个问题,我试图创建代码来重新缩放并将图像放置在特定的位置,如下面的代码所示(在这种情况下,例如,图像应该出现在底层矩形上方)。但是,我似乎无法让图像出现在正确的位置。pyCairo:如何调整图像大小和位置?

我会很感激知道我必须改变,以便为正确定位图像。

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) 
+0

你不可能得到很好的答案,因为人们不能运行这个代码来测试它。请尽可能使用自包含的示例进行更新(并链接到需要运行的任何模块/图像/等) – agf

+6

等待。你*安装* PyCairo?不可能。 – batman

+0

@agf - 其实这是一个自包含的脚本......当你尝试运行它时遇到了什么问题?唯一需要的模块是cairo。 – Derek

回答

3

切换缩放顺序并翻译。先翻译,然后缩放。