Найти - Пользователи
Полная версия: Обрезка изображений с помощью PyQt5
Начало » Python для новичков » Обрезка изображений с помощью PyQt5
1
Temp
Доброго времени суток!

Перейду сразу к делу:
В моей программке пользователь создаёт позицию (товар/услуга и т.д.)
С загрузкой, сохранением данных проблем нет.
К каждой позиции привязана картинка.

Для лучшего отображения в программе картинка должна быть расширения 306х306 пикселей.
Картинка в программке отображается через QLabel -> Pixmap

Дабы не обременять пользователя самостоятельно обрезать картинку создаваемого им позиции я сделал другую программу (так как не смог реализовать данное в PyQt5 (скрин этой программки прикреплен к сообщению)
Там интерфейс максимально простой, перемещаешь изображение мышкой, колесиком увеличиваешь или уменьшаешь. при сохранении, сохраняется лишь тот квадрат по центру формата 306х306 пикселей.

В общем, решил с нуля переделать всю программу целиком и интегрировать функцию обрезки картинки.

Вопрос следующий:
Через какой инструмент можно в PyQt5 осуществлять подобные манипуляции с изображением?

Кто сталкивался с подобной необходимостью, прошу поделится наработками.
Temp
Rodegast
https://stackoverflow.com/questions/7010611/how-can-i-crop-an-image-in-qt
Спасибо за информацию, но я ищу способ обрезки не через код мною, а через интерфейс пользователем приложения.

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

по центру QscrollArea (area) с выключенными ползунками прокрутки, так как они мне мешаются, способа вывернуть их наружу я не нашел.
справа и снизу VerticalScrollBar (vbar) и HorizontalScrollBar (hbar) - мои импровизированные ползунки

внутри area, прижатый к левому верхнему углу без надписи Qlabel (pix)

код загрузки:
 photoopen = QFileDialog.getOpenFileName(self, 'Open file', os.environ['USERPROFILE'] + '\Desktop\\', 'Изображение (*.bmp *.jpg *.png)', )[0]
        if not photoopen == "":
            pixmap = QPixmap(photoopen)
            self.pix.setGeometry(0, 0, pixmap.width(), pixmap.height())
            self.pix.setPixmap(pixmap)
            self.vbar.setValue(0)
            self.hbar.setValue(0)

код обновления для “моих” ползунков далее:
 self.vbar.setRange(0, self.area.verticalScrollBar().maximum())
        self.hbar.setRange(0, self.area.horizontalScrollBar().maximum())

Проблема состоит в том, что внутренние ползунки area не успевают принять новые значения ширины и высоты, и соответственно во втором коде передают устаревшие данные (от предыдущего изображения)
есть ли возможность дать коду прогрузится, а уже после выполнить следующую часть кода?

вторая часть кода работает, если назначить ее на кнопку, скажем “обновить”, но это тупо.
Temp
Вопрос закрыт, проблему решил костылем

при загрузке изображения:
 photoopen = QFileDialog.getOpenFileName(self, 'Open file', os.environ['USERPROFILE'] + '\Desktop\\','Изображение (*.bmp *.jpg *.png)', )[0]
        if not photoopen == "":
            global pmap
            pixmap = QPixmap(photoopen)
            pmap = pixmap
            self.pix.setGeometry(0, 0, pixmap.width(), pixmap.height())
            self.pix.setPixmap(pixmap)
            self.vbar.setValue(0)
            self.hbar.setValue(0)
            self.vbar.setRange(0, 200)
            self.hbar.setRange(0, 200)
при событиях:
 self.vbar.valueChanged.connect(self.refreshbars)
self.hbar.valueChanged.connect(self.refreshbars)
Исполняется:
     def refreshbars(self):
        self.area.verticalScrollBar().setValue(self.vbar.value())
        self.area.horizontalScrollBar().setValue(self.hbar.value())
        self.vbar.setRange(0, self.area.verticalScrollBar().maximum())
        self.hbar.setRange(0, self.area.horizontalScrollBar().maximum())

Понимаю, код ужасен. Иного выхода не нашел.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB