如何获取QPainter绘制的图像以计算红色填充多边形的面积
可行实现思路
方案1:优先选择:存储多边形矢量数据计算(精度更高、性能更好)
你完全不需要靠统计像素来计算面积,直接在用户绘制多边形的阶段就记录所有矢量数据即可:
- 每次用户完成一个多边形绘制时,额外存储两个信息:多边形的顶点坐标列表、填充色属性
- 需要计算红色多边形面积时,遍历所有存储的多边形,筛选出填充色为红色的条目,直接用多边形面积计算公式计算即可
注:如果你的多边形绘制是基于原图片的像素坐标,计算出来的面积单位就是像素,如果要转实际物理面积,乘上单个像素对应的实际尺寸比例即可
PyQt/PySide本身提供了现成的API可以直接算多边形面积:你可以把顶点列表转成QPolygonF对象计算,或者直接用第三方库shapely构造Polygon对象调用.area属性更方便。
方案2:如果确实需要统计像素实现,获取绘制完成的画面方法如下
你可以直接对QLabel控件进行截图,拿到绘制完成的QPixmap对象,再转成可遍历像素的图像对象即可:
具体实现步骤:
- 对目标QLabel控件执行截图,获取完整绘制结果:
# 假设你的QLabel对象名为label rendered_pixmap = label.grab()
- 将QPixmap转成QImage来遍历像素:
from PyQt5.QtGui import qRgb image = rendered_pixmap.toImage() width = image.width() height = image.height() red_pixel_count = 0 # 要匹配的红色,可根据你实际使用的红色值调整 target_red = qRgb(255, 0, 0) for x in range(width): for y in range(height): if image.pixel(x, y) == target_red: red_pixel_count += 1 # 面积就是像素数量,转物理单位同上乘比例即可 area = red_pixel_count
注意:如果你的QLabel有缩放显示图片的情况,要注意坐标映射:如果图片是被拉伸/缩小显示在QLabel上的,统计出来的像素数要乘上缩放比例才能得到原图片坐标系下的实际像素面积。
内容的提问来源于stack exchange,提问作者pupinho
相关产品推荐
相关产品推荐

