Обрезать изображение до формы круга для PyQt

Я создаю простое приложение с PyQt6. Я хочу, чтобы мой код автоматически обрезал выбранное изображение в форме круга. Как я могу это сделать? Пожалуйста помоги


person Community    schedule 14.03.2021    source источник
comment
Почему вы не позволяете приложению PyQt выбрать файл изображения, а затем обрезать его с помощью Pillow, а затем снова отобразить изображение в приложении?   -  person raspiduino    schedule 14.03.2021
comment
Может ли библиотека Pillow сделать это?   -  person    schedule 14.03.2021
comment
Да, см. этот пост.   -  person raspiduino    schedule 14.03.2021


Ответы (1)


Использование внешней библиотеки, такой как подушка или 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

Это, очевидно, создает изображение с прозрачным фоном по кругу, вы можете использовать любой из глобальные цвета или ваш собственный QColor.
Обратите внимание, что независимо от цвета, fill() обязателен, в противном случае, вероятно, на неокрашенных участках будут случайные пиксели. изображение вместо этого (обычно некоторый остаток ОЗУ).

person musicamante    schedule 14.03.2021