pyqt5 сохраняя изображение от переполнения qlabel - PullRequest
0 голосов
/ 10 апреля 2020

Я пытался сохранить изображение, установленное из qpixmap, чтобы оно не выходило за границы qlabel. Цель состоит в том, чтобы qlabel обрезал любую часть изображения, которая не вписывается в qlabel.

Вот код, который я использую:

    self.pPic = QtWidgets.QLabel(self.frame)  
    self.pPic.setGeometry(QtCore.QRect(50, 55, 150, 140))
    self.pPic.setStyleSheet("border: 3px solid blue; border-radius: 40px;") 
    self.pPic.setScaledContents(True)
    self.pixmap = QtGui.QPixmap()
    self.pixmap.fill(Qt.transparent)
    self.pixmap.scaled(self.pPic.width(),self.pPic.height())
    self.pixmap.loadFromData(pFile_picLink)
    self.pPic.setAlignment(QtCore.Qt.AlignCenter)
    self.pPic.setPixmap(self.pixmap)
    self.pPic.setObjectName("PPic")

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020

то, о чем писал @musicamante, может выглядеть так:

from PyQt5 import QtCore, QtGui, QtWidgets
import requests


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()

        url_image = 'https://live.staticflickr.com/65535/49251422908_591245c64a_c_d.jpg'

        source = QtGui.QImage()
        source.loadFromData(requests.get(url_image).content)       
        self.resize(source.width(), source.height())

        output = QtGui.QPixmap(source.width(), source.height())
        output.fill(QtCore.Qt.transparent)

        qp = QtGui.QPainter(output)
        clipPath = QtGui.QPainterPath()
        clipPath.addRoundedRect(QtCore.QRectF(source.rect()), source.width()//2, source.width()//2)
        qp.setClipPath(clipPath)
        qp.drawPixmap(0, 0, QtGui.QPixmap(source))
        qp.end()

        self.pPic = QtWidgets.QLabel() 
        self.pPic.setPixmap(output)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.pPic, alignment = QtCore.Qt.AlignCenter)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

enter image description here

0 голосов
/ 11 апреля 2020

Прежде всего, всегда приводите минимальный, воспроизводимый пример .

Затем, здесь есть некоторые заблуждения, которые требуют некоторых пояснений:

  • вы можете 'обрезать' содержимое растрового изображения просто так, поскольку таблица стилей, заданная для QLabel, не заботится о его содержимом;
  • QPixmap.scaled() возвращает " a копия растрового изображения, масштабированного до прямоугольника с заданной шириной и высотой"; поскольку вы не используете возвращаемое значение, ваш вызов совершенно бесполезен;
  • вызов fill() не требуется, если вы собираетесь загружать данные из существующего файла, до тех пор, пока эти данные успешно загружены;

Единственный способ "обрезать" изображение, как вы хотели бы сделать, это применить clipping (что более точно термин для этого вида обработки изображений).
Обратите внимание, что таблицы стилей, примененные к Qt, не могут быть доступны напрямую, поэтому у вас нет прямого способа узнать значение border-radius.

    source = QtGui.QPixmap()
    # I really don't know what "pFile_picLink" is, but you really shouldn't use it
    # like that; use python's "with open()" or QFile.readAll() instead.
    source.loadFromData(pFile_picLink)
    output = QtGui.QPixmap(source.width(), source.height())
    output.fill(QtCore.Qt.transparent)

    # create a new QPainter on the output pixmap
    qp = QtGui.QPainter(output)
    clipPath = QtGui.QPainterPath()
    # the "40" value is taken from the border radius of the label stylesheet
    clipPath.addRoundedRect(QtCore.QRectF(source.rect()), 40, 40)
    # clip the contents to the rounded path we just created
    qp.setClipPath(clipPath)
    qp.drawPixmap(0, 0, source)
    # ending the QPainter object is mandatory when dealing with painter
    # objects created for images
    qp.end()

    self.pPic.setPixmap(output)

Наконец и совершенно не связаны, избегайте смешивания стилей импорта: в вашем коде есть Qt.transparent и QtCore.Qt.AlignCenter.
Используйте либо from PyQt5 import QtCore вместе с QtCore.Qt.whatever, либо from PyQt5.QtCore import Qt с Qt.whatever; смешивать их просто непонятно и абсолютно не нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...