如何基于同场景下旋转的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
相关产品推荐
相关产品推荐

