将图像裁剪为 PyQt 的圆形

时间:2021-03-14 15:07:34

标签: python pyqt pyqt5 pyqt6

我正在使用 PyQt6 创建一个简单的应用程序。我想让我的代码自动将选定的图像裁剪成圆形。我怎样才能做到这一点?请帮忙

1 个答案:

答案 0 :(得分:1)

使用像 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, 0, size, size)
    qp.setClipPath(path)

    sourceRect = QtCore.QRect(0, 0, size, size)
    sourceRect.moveCenter(source.rect().center())
    qp.drawPixmap(target.rect(), source, sourceRect)
    qp.end()

    return target

这显然会在圆圈周围创建一个具有透明背景的图像,您可以使用任何 global colors 或您自己的 QColor。
请注意,无论颜色如何,fill() 都是强制,否则图像未上漆的部分可能会出现随机像素(通常是一些“RAM 残留物”)。 >