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

如何基于同场景下旋转的QGraphicsRectItem裁剪Scene上的QPixmap

实现旋转选区裁剪的解决方案

你可以通过坐标映射+遮罩的方式实现任意旋转角度的矩形选区裁剪,修改步骤如下:

第一步:补充存储变量

先修改set_image方法,存储裁剪需要用到的核心对象:

def set_image(self, path):
    self.original_pixmap = QtGui.QPixmap(path)
    pixmap = self.original_pixmap
    if pixmap:
        pixmap = pixmap.scaledToHeight(self.roi_scale * pixmap.height())
    self.scaled_pixmap = pixmap # 存储缩放后的展示用pixmap
    self.scene.clear()
    self.pixmap_item = self.scene.addPixmap(pixmap) # 存储pixmap对应的场景item
    self.setAlignment(QtCore.Qt.AlignCenter)

第二步:添加裁剪功能方法

在crop_pattern类中新增裁剪方法,自动适配选区的旋转、位移属性:

def crop_region(self):
    # 获取选区相对于pixmap对象的变换矩阵
    transform = self.shape.itemTransform(self.pixmap_item)[0]
    # 将旋转后的选区形状映射到pixmap的本地坐标系
    shape_in_pixmap = transform.map(self.shape.shape())
    # 取选区在pixmap上的外接矩形边界
    bounding_rect = shape_in_pixmap.boundingRect().toRect()

    # 生成选区遮罩
    mask = QtGui.QBitmap(self.scaled_pixmap.size())
    mask.fill(QtCore.Qt.color0) # 初始全透明
    painter = QtGui.QPainter(mask)
    painter.setPen(QtCore.Qt.NoPen)
    painter.setBrush(QtCore.Qt.color1) # 选区位置设为不透明
    painter.drawPath(shape_in_pixmap)
    painter.end()

    # 应用遮罩并裁剪出对应区域
    temp_pixmap = self.scaled_pixmap.copy()
    temp_pixmap.setMask(mask)
    cropped_pixmap = temp_pixmap.copy(bounding_rect)

    # 发送裁剪完成信号
    self.img_is_cropped.emit(cropped_pixmap)

    # 若需要原始分辨率的裁剪结果,将坐标除以self.roi_scale后对self.original_pixmap做相同处理即可

第三步:绑定触发逻辑

将裁剪按钮的点击信号绑定到crop_region方法,点击按钮即可获取选区对应的裁剪结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:27:01