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ệ và đị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)
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
Chờ đợi. Bạn * CÀI ĐẶT * PyCairo ?? Không thể nào. – batman
@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