问题描述
我正在使用 PyQt6 创建一个简单的应用程序。我想让我的代码自动将选定的图像裁剪成圆形。我怎样才能做到这一点?请帮忙
解决方法
使用像 Pillow 或 opencv 这样的外部库可以让事情变得简单,因为它们通常具有已经提供类似处理的函数,但是没有必要为这样的简单操作添加依赖项,除非性能成为问题。
在 Qt 上,它非常简单:基于最小范围创建一个新的 QPixmap(假设圆形将是给定矩形中可能最大的圆形),创建一个带有圆形的 QPainterPath,用于剪裁,最后在其中绘制源内容。
def circleImage(imagePath):
source = QtGui.QPixmap(imagePath)
size = min(source.width(),source.height())
target = QtGui.QPixmap(size,size)
target.fill(QtCore.Qt.transparent)
qp = QtGui.QPainter(target)
qp.setRenderHints(qp.Antialiasing)
path = QtGui.QPainterPath()
path.addEllipse(0,size,size)
qp.setClipPath(path)
sourceRect = QtCore.QRect(0,size)
sourceRect.moveCenter(source.rect().center())
qp.drawPixmap(target.rect(),source,sourceRect)
qp.end()
return target
这显然会在圆圈周围创建一个具有透明背景的图像,您可以使用任何 global colors 或您自己的 QColor。
请注意,无论颜色如何,fill()
都是强制,否则图像未上漆的部分可能会出现随机像素(通常是一些“RAM 残留物”)。 >