2011-08-22 19 views
8

Dựa trên câu hỏi Create PDF with (resized) PNG images using Pycairo - rescaling Surface issue Tôi đã cố tạo mã để rescales và đặt hình ảnh ở vị trí cụ thể, như được hiển thị trong mã bên dưới (trong trường hợp này, ví dụ: hình ảnh sẽ xuất hiện "trên" hình chữ nhật bên dưới). Tuy nhiên, tôi dường như không thể làm cho hình ảnh xuất hiện ở vị trí chính xác.pyCairo: Cách thay đổi kích thước và định vị hình ảnh?

Tôi rất muốn biết những gì tôi phải thay đổi, để cả hai tỷ lệ định vị chính xác hình ảnh.

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

Bạn sẽ không nhận được câu trả lời hay vì mọi người không thể chạy mã này để kiểm tra. Vui lòng cập nhật nó với một ví dụ tự chứa nếu có thể (và liên kết đến bất kỳ mô-đun/hình ảnh/vv là cần thiết để chạy nó) – agf

+6

Chờ đợi. Bạn * CÀI ĐẶT * PyCairo ?? Không thể nào. – batman

+0

@agf - Thực ra đây là một tập lệnh tự chứa ... bạn gặp phải vấn đề gì khi cố gắng chạy nó? Module duy nhất cần thiết là cairo. – Derek

Trả lời

3

Chuyển thứ tự tỷ lệ và dịch. Dịch trước, sau đó mở rộng.

Các vấn đề liên quan