Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Hvzh от Октябрь 19, 2015, 15:16



Название: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Hvzh от Октябрь 19, 2015, 15:16
Доброго времени суток!
Имеется изображение, которое грузится в QGraphicsScene и отображается в QGraphicsView. Необходимо обеспечить возможность выделения прямоугольной части изображения и сохранения ее в файл. Может, кто сталкивался?


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Nidxogg от Октябрь 19, 2015, 17:00
Один из вариантов:
-Создать подкласс QGraphicsScene
-Переопределить mousePress/Move/Release event-ы
В press задается начальная точка (qt пример DiagramScene посмотрите)
в move рисуется выделяющий прямоугольник
в release получаете конечную точку и координаты выделенного прямоугольника соответственно
-заренделить выбранную область
Примерно так (только использовать координаты прямоугольника естественно)
Код:

        QImage image = QImage(ui->graphicsView->viewport()->rect().size(), QImage::Format_ARGB32);
        QPainter p1(&image);
        ui->graphicsView_header->viewport()->render(&p1);
        image.save(fileName,fileFormat);


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Bepec от Октябрь 19, 2015, 17:06
А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом :)


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Nidxogg от Октябрь 19, 2015, 17:10
А можно повесить евент фильтр с тем же результатом, но это уже просто разные варианты с одинаковым результатом :)
Через евент фильтр не пробовал


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Hvzh от Октябрь 19, 2015, 17:14
Спасибо, завтра буду пробовать


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Hvzh от Октябрь 19, 2015, 17:36
Вдогонку еще вопрос (я с QGraphicsScene/QGraphicsView столкнулся сегодня в первый раз). Загрузил я, скажем, изображение (оно большое, поэтому видна только его часть), средствами QGraphicsView повернул его на 90 градусов. После этого нужно его сохранить в повернутом виде. Если я сохраняю QImage(ui->graphicsView->viewport()->rect().size(), QImage::Format_ARGB32), то сохраняется только видимая часть изображения, а вот так - QImage image(scene->sceneRect().size().toSize(), QImage::Format_ARGB32) - исходное, не повернутое...


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Old от Октябрь 19, 2015, 19:22
Через евент фильтр не пробовал
И не надо.
Фильтр событий это экстренный вариант решения проблемы, но не как ни штатное средство разработки.
Когда, вы делаете полноценный виджет обрабатывающий события, то вы знаете, что если этот виджет в фокусе, то все события адресуются в первую очередь ему. А при использовании фильтров событий, обработчик события можно поместить в какой-то объект, который и виджетом не будет являться и он будет обрабатывать события, а вы судорожно разбираться, почему до какого-то виджета не доходят какие-то события вообще. И чем больше у вас будет навешено фильтров, тем сложнее с этим хозяйством будет разбираться.


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Bepec от Октябрь 19, 2015, 20:00
Old вы немного не правы.
EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно.

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

PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события :)


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Old от Октябрь 19, 2015, 20:10
EventFilter - это стандартный способ внести изменения в стандартную обработку, НЕ ОТКЛЮЧАЯ её и не производя фигню с наследованием ради пары функций, что ущербно.
Можно наследоваться и ради одной функции и это будет лучшим решением. Количество переопределяемых функций не имеет никакого значения.
И то, что это средство доступно, вовсе не означает, что его нужно пихать во все места. Это по настоящему - ущербно.

Никто не мешает дальше посылать события виджетам как обычно, а то что вы привели это просто код программистов, которые не читали описания к eventFilter :)
Я привел то, что происходит в больших проектах, когда все кто угодно пытаются навешивать фильтры на все, что только можно. Потом, они месяцами не могут найти причины не прихода событий куда надо, а потом все дружно мы находим фильтр событий установленный куда нибудь на главное окно или объект QApplication, который по неведомым никому правилам пытался "обрабатывать" какие-то события.

PS даже сотня фильтров не изменит поведение стандартных виджетов, если не будут глотать события :)
Ну вот ТС нужно что бы обработчик, в вашей терминологии, глотал события.


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Bepec от Октябрь 19, 2015, 20:48
Old давайте не будем спорить - это официальный и доступный и удобный способ. Всякие "наследоваться и менять функцию" - это так же губительно при кривых руках.

Специально для вас - проект маленький, человек учится, и да - все все изменения отслеживаются при помощи Ctrl+F "eventFilter". Вместо сотен классов огромного проекта, в каждом из которых будет переопределено по 1 функции.

Не надо писать - "Это плохой способ", "это ЛУЧШЕЕ решение", "Хрен потом найдешь".
Надо писать - это один из вариантов, который ВАМ лично не нравится, ВЫ считаете его худшим и ВЫ хрен потом найдете куда события улетают :) Ну или приводите пруфы от титанов Qt/C++.

PS а на деле мало данных от ТСса, возможно он работает с изображением как с QGraphicsItem(или одним его специализированным предком), так что вариант с View лишь наши догадки :)


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Old от Октябрь 19, 2015, 20:53
Ну или приводите пруфы от титанов Qt/C++.
Верес, я совершенно не собираюсь вам ничего доказывать, тем более приводить пруфы от непонятных людей. :)
Делайте как угодно.


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Bepec от Октябрь 19, 2015, 20:55
Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим :D
Ну да не суть :)


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Old от Октябрь 19, 2015, 20:57
Просто младые умы, будут считать ваши откровения истиной в первой инстанции. Вместо того, чтобы попробовать самим :D
Ну да не суть :)
Они будут осторожны и не будут этот механизм сувать во все места. А для небольших "корректировок" он очень удобен.


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Hvzh от Октябрь 20, 2015, 09:27
Видимо, придется дать более детальное описание проекта. Проект представляет собой систему самостоятельного сканирования. Пользователь сканирует, например, книгу. Скан сохраняется в виде Jpeg-файла. При этом средствами OpenCV производится обрезка фона, при необходимости разбивка на правую-левую страницы. Полученные сканы отображаются в виде thumbnail'ов в галерее. Далее, пользователь может кликнуть на одном из thumbnail'ов, после чего изображение выводится в окно редактирования. Пользователь может повернуть изображение, изменить его яркость, резкость, контраст. Все это опять же делается средствами OpenCV. А вот вывод результирующего изображения в окно редактирования делается так:

Код:
    imageLabel->setPixmap(QPixmap::fromImage(img.scaled(this->width(), this->height(), Qt::KeepAspectRatio)));

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


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Bepec от Октябрь 20, 2015, 12:45
Прикольно, имеется imageLabel. Интересно какого оно типа :D
Мб не стоит использовать QGraphicsView/Scene с такой задачей?


Название: Re: QGraphicsScene/QGraphicsView: выделение части изображения
Отправлено: Hvzh от Октябрь 20, 2015, 12:50
Прикольно, имеется imageLabel. Интересно какого оно типа :D
Мб не стоит использовать QGraphicsView/Scene с такой задачей?

А я и не использовал до недавнего времени. А imageLabel -  это обычный QLable. Мне его вполне хватало. И заказчика все устраивало. Но я совершенно не понимаю, как в свете того концепта реализовать эти две дополнительные функции. Поэтому и решил попробовать заменить QLabel на QGraphicsView/Scene.