将图像裁剪为 PyQt 的圆形

问题描述

我正在使用 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 残留物”)。 >

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...