You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReportLab中drawImage()显示PNG图片倒置的解决咨询

解决ReportLab中drawImage显示PNG图片倒置的问题

问题原因

图片倒置的核心是matplotlib与ReportLab的坐标系统差异:

  • matplotlib保存的图片采用常规的Top-Down坐标(原点在左上角)
  • 你初始化ReportLab画布时设置了bottomup=0,强制画布使用Top-Down坐标,但drawImage函数在该模式下仍会按默认规则渲染图片,最终导致翻转。

解决方案

以下是两种简单可行的修复方式:

方法1:移除bottomup=0,使用ReportLab默认坐标系统

ReportLab默认采用Bottom-Up坐标(原点在左下角),移除bottomup=0后,只需调整图片的y轴坐标即可正常显示:

import numpy as np
import matplotlib.pyplot as plt
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape, A4
from reportlab.lib.utils import ImageReader

# 生成环形图代码不变
fig = plt.figure()
data = [10,30,25,15,10]
plt.pie(data, labels = ['A', 'B', 'C', 'D', 'E'])
circle = plt.Circle( (0,0), 0.7, color='#0c1c33')
p = plt.gcf()
p.gca().add_artist(circle)
plt.savefig('test_donut.png')
plt.close()  # 关闭窗口释放资源

# 初始化画布时移除bottomup=0
page_width, page_height = landscape(A4)
my_canvas = canvas.Canvas("Test_Rapport.pdf", pagesize=landscape(A4))
# 计算y坐标:页面高度 - 图片底部间距 - 图片高度
img_width, img_height = 200, 150
x = 300
y = page_height - 150 - img_height
my_canvas.drawImage(ImageReader('test_donut.png'), x, y, width=img_width, height=img_height)
my_canvas.save()

方法2:保留bottomup=0,翻转图片后再渲染

如果必须使用Top-Down坐标,可以用PIL库先将图片垂直翻转,再传入drawImage:

import numpy as np
import matplotlib.pyplot as plt
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import landscape, A4
from reportlab.lib.utils import ImageReader
from PIL import Image  # 需安装:pip install pillow

# 生成环形图代码不变
fig = plt.figure()
data = [10,30,25,15,10]
plt.pie(data, labels = ['A', 'B', 'C', 'D', 'E'])
circle = plt.Circle( (0,0), 0.7, color='#0c1c33')
p = plt.gcf()
p.gca().add_artist(circle)
plt.savefig('test_donut.png')
plt.close()

# 垂直翻转图片
img = Image.open('test_donut.png')
flipped_img = img.transpose(Image.FLIP_TOP_BOTTOM)

# 保持bottomup=0初始化画布
my_canvas = canvas.Canvas("Test_Rapport.pdf", pagesize=landscape(A4), bottomup=0)
my_canvas.drawImage(ImageReader(flipped_img), 300, 150, width=200, height=150)
my_canvas.save()

额外提示

  • 优先推荐方法1,符合ReportLab的设计规范,能减少后续坐标计算的混乱
  • 使用方法2时,需确保已安装pillow库

内容的提问来源于stack exchange,提问作者user15565396

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 03:24:23