Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 23, 2021 18:19:24

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Обрезка изображений с помощью PyQt5

Доброго времени суток!

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

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

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

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

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

Кто сталкивался с подобной необходимостью, прошу поделится наработками.

Прикреплённый файлы:
attachment скрин.jpg (82,4 KБ)

Офлайн

#2 Фев. 23, 2021 19:56:02

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

Обрезка изображений с помощью PyQt5

https://stackoverflow.com/questions/7010611/how-can-i-crop-an-image-in-qt



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Фев. 23, 2021 20:54:44

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Обрезка изображений с помощью PyQt5

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 не успевают принять новые значения ширины и высоты, и соответственно во втором коде передают устаревшие данные (от предыдущего изображения)
есть ли возможность дать коду прогрузится, а уже после выполнить следующую часть кода?

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

Прикреплённый файлы:
attachment скрин.jpg (87,0 KБ)

Офлайн

#4 Фев. 24, 2021 12:16:35

Temp
Зарегистрирован: 2021-01-16
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Обрезка изображений с помощью PyQt5

Вопрос закрыт, проблему решил костылем

при загрузке изображения:

 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())

Понимаю, код ужасен. Иного выхода не нашел.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version