Как убрать растушевку краев изображения при размытии?

Я применяю эффект размытия к виджету back_picture, который представляет собой изображение.

Сейчас это выглядит так:

введите сюда описание изображения

На скрине видно, что края изображения размываются, из-за чего появляется темная рамка. Мне нужно как-то избавиться от этой рамки, иначе говоря, сделать края изображения четкими. Для того, чтобы было немного понятнее, я нарисовал картинку как сейчас/как надо. Вот она:

введите сюда описание изображения

Конечно, можно избавиться от растушевки краев путем уменьшения области размытия. Но это не лучший способ, т.к., если сильно уменьшить область размытия, то будет заметно, что не все изображение размыто, а это совсем мне не подходит:

введите сюда описание изображения

Пожалуйста, подскажите, как оставить края изображения четкими при размытии изображения?

from PyQt5 import QtCore, QtWidgets, QtGui

class BackPicture(QtWidgets.QLabel):
    def __init__(self, picture, x, *args, **kwargs):
        super(BackPicture, self).__init__(*args, **kwargs)
        self.setFixedSize(x, x)
        self.x = x
        self.setPicture(picture)

    def setPicture(self, picture):
        self.setPixmap(QtGui.QPixmap(picture).scaled(self.x, self.x, QtCore.Qt.KeepAspectRatio))


class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super().__init__(parent)
        self.index = 1

        btn = QtWidgets.QPushButton('Remake', clicked = self.remake)

        self.container = QtWidgets.QWidget()
        self.container.setStyleSheet('background: #2A303D;')
        self.container.setMinimumHeight(300)
        self.container.setFixedWidth(300)

        main_box = QtWidgets.QHBoxLayout(self)
        main_box.addWidget(btn)        
        main_box.addWidget(self.container)

        box = QtWidgets.QVBoxLayout(self.container)
        box.setContentsMargins(0, 0, 0, 0)

        self.back_picture = BackPicture('picture3.jpg', 300, self.container)
        self.back_picture.move(0, 0)

        blur_effect = QtWidgets.QGraphicsBlurEffect(blurRadius = 3)
        self.back_picture.setGraphicsEffect(blur_effect)

        label1 = QtWidgets.QLabel('Text number 1')
        label1.setStyleSheet(qss)
        box.addWidget(label1, alignment = QtCore.Qt.AlignCenter)

    def remake(self):
        if self.index == 1:
            self.back_picture.setPicture('picture2.png') 
            self.index = 2
        else:
            self.back_picture.setPicture('picture1.png') 
            self.index = 1


qss = '''QLabel {
             color: red;
             font: bold 16px;
             background: transparent;
         }'''

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle(' ')
    window.show()
    sys.exit(app.exec_())

UPD: Вот картинка, обложка к музыкальному альбому Linkin Park - The Hunting Party

введите сюда описание изображения


Ответы (1 шт):

Автор решения: S. Nick

Я не уверен, что правильно вас понимаю, но попробуйте:

from PyQt5 import QtCore, QtWidgets, QtGui

class BackPicture(QtWidgets.QLabel):
    def __init__(self, picture, x, *args, **kwargs):
        super(BackPicture, self).__init__(*args, **kwargs)
        self.setFixedSize(x, x)
        self.x = x
        self.setPicture(picture)

    def setPicture(self, picture):
        self.setPixmap(QtGui.QPixmap(picture).scaled(self.x, self.x, QtCore.Qt.KeepAspectRatio))


class MyWindow(QtWidgets.QWidget):
    def __init__(self, parent = None):
        super().__init__(parent)
        self.index = 1

        btn = QtWidgets.QPushButton('Remake', clicked = self.remake)

        self.container = QtWidgets.QWidget()
        self.container.setStyleSheet('background: #2A303D;')
        self.container.setMinimumHeight(300)
        self.container.setFixedWidth(300)

        main_box = QtWidgets.QHBoxLayout(self)
        main_box.addWidget(btn)        
        main_box.addWidget(self.container)

        box = QtWidgets.QVBoxLayout(self.container)
        box.setContentsMargins(0, 0, 0, 0)


#        self.back_picture = BackPicture('lena.jpg', 300, self.container)
#        self.back_picture.move(0, 0)

        self.back_picture = BackPicture('lena.jpg', 310, self.container)            # +++
        self.back_picture.move(-5, -5)                                              # +++ 


        blur_effect = QtWidgets.QGraphicsBlurEffect(blurRadius=3)        
        self.back_picture.setGraphicsEffect(blur_effect)

        label1 = QtWidgets.QLabel('Text number 1')
        label1.setStyleSheet(qss)
        box.addWidget(label1, alignment = QtCore.Qt.AlignCenter)

    def remake(self):
        if self.index == 1:
            self.back_picture.setPicture('img/LinkinPark1.jpg') 
            self.index = 2
        else:
            self.back_picture.setPicture('img/LinkinPark2.png') 
            self.index = 1


qss = '''QLabel {
             color: red;
             font: bold 16px;
             background: transparent;
         }'''

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    window = MyWindow()
    window.setWindowTitle(' ')
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка