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
相关产品推荐
相关产品推荐

