Как закруглить края изображения?
Я учусь делать приложения на PyQt5, и у меня появилась задача закруглить края изображения.
Есть ли какой-то способ сделать это с помощью модуля PyQt или посредством самого python? Конечно, ответы на такие вопросы стоит искать в гугле, но я уже потратил достаточно много времени на это, заглядывал в учебник PyQt и ничего не нашел.
from PyQt5 import QtWidgets, QtGui, QtCore
import sys
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
button = QtWidgets.QPushButton()
button.setStyleSheet('''QPushButton {
border: none;
margin: 0px;
padding: 0px;
}''')
button.setIcon(QtGui.QIcon('picture1.png'))
button.setIconSize(QtCore.QSize(140, 140))
box = QtWidgets.QHBoxLayout()
box.addWidget(button)
window.setLayout(box)
window.show()
sys.exit(app.exec_())
Ответы (1 шт):
Когда я писал в комментарии, то имел ввиду,
что изображение уже изначально круглое (см. head3.png)
Но вы пошли дальше и неправильно сформулировали вопрос,
я бы спросил так: 'Есть картинка формата .jpg или .png, как средствами PyQt5
обрезать ее так, чтобы она стала круглой.'
Пример изображения head2.jpg, а получить хочу head3.png смотрите выше.
Я продемонстрирую вам это, взяв за основу мой ответ из предыдущего вашего вопроса.
QIcon::QIcon(const QPixmap &pixmap)
Создает значок из растрового изображения.
self.icon = QIcon(self.target)
bool QPixmap::save(const QString &fileName, const char *format = nullptr, int quality = -1) const
Сохраняет растровое изображение в файл с заданным именем файла, используя указанный формат файла изображения и коэффициент качества. Возвращает true в случае успеха; в противном случае возвращает false.
Остальное прокомментировано по тексту кода. Нажмите на любую кнопку.
import sys
from PyQt5.Qt import *
class Label(QLabel):
clicked = pyqtSignal()
def __init__(self, *args, antialiasing=True, **kwargs):
super(Label, self).__init__(*args, **kwargs)
self.Antialiasing = antialiasing
self.setMaximumSize(140, 140)
self.setMinimumSize(140, 140)
self.radius = 70
self.target = QPixmap(self.size())
self.target.fill(Qt.transparent)
p = QPixmap("head2.jpg").scaled(
140, 140, Qt.KeepAspectRatioByExpanding, Qt.SmoothTransformation)
painter = QPainter(self.target)
if self.Antialiasing:
painter.setRenderHint(QPainter.Antialiasing, True)
painter.setRenderHint(QPainter.HighQualityAntialiasing, True)
painter.setRenderHint(QPainter.SmoothPixmapTransform, True)
path = QPainterPath()
path.addRoundedRect(
0, 0, self.width(), self.height(), self.radius, self.radius)
painter.setClipPath(path)
painter.drawPixmap(0, 0, p)
self.setPixmap(self.target)
# QIcon::QIcon(const QPixmap &pixmap)
# Создает значок из растрового изображения.
self.icon = QIcon(self.target) # +++
def mouseReleaseEvent(self, event):
self.clicked.emit()
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__(*args, **kwargs)
# когда я писал в комментарии, то имел ввиду,
# что изображение уже изначально круглое (см. `head3.png`)
self.buttonCircularImage = QPushButton(clicked=self.onClicked) # +++
self.buttonCircularImage.setFixedSize(145, 145)
self.buttonCircularImage.setIcon(QIcon("head3.png"))
self.buttonCircularImage.setIconSize(QSize(140, 140))
self.label = Label(self)
self.label.clicked.connect(self.onClicked)
self.button = QPushButton(clicked=lambda: print('button')) # +++
self.button.setFixedSize(145, 145)
self.button_2 = QPushButton(clicked=lambda: print('button_2')) # +++
self.button_2.setFixedSize(145, 145)
self.layout = QHBoxLayout(self)
self.layout.addWidget(self.buttonCircularImage)
self.layout.addWidget(self.label)
self.setStyleSheet("background: green;")
def onClicked(self):
name = 'image_save' # так будет называться новое изобразение
if name:
pixmap = self.label.icon.pixmap(140, 140, QIcon.Normal, QIcon.On)
_icon = "{}.png".format(name) # image_save.png - так будет называться новое изобразение
pixmap.save(_icon, quality = -1) # Сохраняет растровое изображение в файл с заданным именем файла
# Это как бы по ходу дела
self.button.setIcon(self.label.icon)
self.button.setIconSize(QSize(140, 140))
self.layout.addWidget(self.button)
# Это загружает из сохраненного файла 'image_save.png'
self.button_2.setIcon(QIcon(_icon)) # _icon = 'image_save.png'
self.button_2.setIconSize(QSize(140, 140))
self.layout.addWidget(self.button_2)
if __name__ == "__main__":
app = QApplication(sys.argv)
w = Window()
w.resize(400, 400)
w.show()
sys.exit(app.exec_())


