zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
1

Как отобразить QImage сложной формы на другом QImage, чтобы фон от 1-го рисунка был прозрачен?

24.07.2014, 18:42. Показов 2704. Ответов 12
Метки нет (Все метки)

пишу простеньку игрушку в целях осваивания QT. Задача - нарисовать 1 объект QImag поверх другого объекта QImag. Как это сделать ...?

Ну и в целом хотелось бы некоторые нюансы узнать:
Есть карта, состоящая из 40x40 картинок .jpg, заполняется рандомно в зависимости от того как сгенерируется думерный массив. Вообщем хотел запилить на карту человечков, чтобы они могли перемещаться, но:
1) как уже сказал как сделать так, чтобы картинка .jpg была с прозрачным фоном не понятно...вроде в фотошопе сделал его на прозрачном фоне, думал что это как-то учитывается, но в итоге фон просто белый...
2) здесь просто интересует следующее, правильно ли я рассуждаю - в каком виде лучше хранить саму карту - скажем если она достаточно здоровая то лучше её сгенерировать и записать в файл, после чего в случае если мы перемещаем экран с 1 области в другую на достаточном расстоянии, то подгружать из этого файла новую инфу в , ну а в paintEvent просто перерисовывать всё это дело
3) сам механизм рисования - с графикой дел не имел, так что придумал только так: есть QTimer , в нём я каждые 1мс к примеру перерисовываю виджет (потом сделаю чтобы перерисовывалась только отдельная область, видел там какие-то методы для этого были) через timeout() и update(), подход как мне кажется не самый правильный...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2014, 18:42
Ответы с готовыми решениями:

Как сделать чтобы Label был сверху картинки и был прозрачен?
Как сделать чтобы label был сверху картинки и он был прозрачен?

Возможно ли подружить QImage так, чтобы предыдущие функции с флажками остались?
в проекте есть карта, она загружается в виде QImage, над ней возможны всякие манипуляции - типа...

Сохранить QImage как JPEG
Собственно, требуется сохранить картинку полученную со сканера. Я получаю QImage и сохраняю его...

Как открыть картинку в QImage?
Привет форум! в QT только учусь работать, пишу по шлее и никак не могу понять, что у меня не так -...

12
136 / 140 / 7
Регистрация: 22.08.2011
Сообщений: 484
24.07.2014, 20:03 2
Для начала откройте для себя секрет прозрачности в jpg...

А потом подумайте, как много будет зажирать памяти по отрисовке карта....

Ну и в конце посмотрите примеры класса с анимацией - там просто....

____________________________________________________________ ____________

# Картинки рисуются в Qt на лабелях...

# В jpg нет прозрачности - смотрите gif или png...
png - самый родной тип для Qt...
gif - можно тоже использовать для красоты...

Не по теме:

(помнится, вроде, старый builder делал невидимыми
*.jpg пикселы левый верхний и все такого же цвета,
если выставить такую опцию для неё, тут такого нет).



# Держите всё в памяти и если "прям край", то в файле...

# В принципе - по таймеру, но для эффекта - то с анимацией...
1
1397 / 1254 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
24.07.2014, 20:27 3
Цитата Сообщение от dzrkot Посмотреть сообщение
Задача - нарисовать 1 объект QImag поверх другого объекта QImag. Как это сделать ...?
C++ (Qt)
1
2
3
4
5
QImage img1;
QImage img2;
QPainter p;
p.drawImage(0,0,img1);
p.drawImage(0,0,img2);
Цитата Сообщение от dzrkot Посмотреть сообщение
как уже сказал как сделать так, чтобы картинка .jpg была с прозрачным фоном не понятно
При чем тут Qt? У jpeg нет прозрачности.

Цитата Сообщение от dzrkot Посмотреть сообщение
то подгружать из этого файла новую инфу
файловые операции самые затратные

Цитата Сообщение от dzrkot Посмотреть сообщение
в нём я каждые 1мс к примеру перерисовываю виджет
1000фпс? ну-ну... как минимум 1000/60.

Для игры нужен не чистый виджет с qpainter, а сцена ака QGraphicsScene. А то вы задолбаетесь самостоятельно все отслеживать, без графа.

Цитата Сообщение от _SASA_ Посмотреть сообщение
Картинки рисуются в Qt на лабелях...
"Картинки" в Qt можно рисовать на чем угодно. И да, label - транслитирируется как лейбэл.

Цитата Сообщение от _SASA_ Посмотреть сообщение
png - самый родной тип для Qt...
Он не родной, он просто подключен по умолчанию так как необходим для работы.
1
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
24.07.2014, 22:22  [ТС] 4
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Для игры нужен не чистый виджет с qpainter, а сцена ака QGraphicsScene. А то вы задолбаетесь самостоятельно все отслеживать, без графа.
по поводу сцены - пытался на ней рисовать, но она начинает всё как-то центровать, и в итоге где что оказывается я не понимаю

Цитата Сообщение от RazrFalcon Посмотреть сообщение
Цитата Сообщение от dzrkot Посмотреть сообщение
как уже сказал как сделать так, чтобы картинка .jpg была с прозрачным фоном не понятно
При чем тут Qt? У jpeg нет прозрачности.
не знал, спасибо

Цитата Сообщение от RazrFalcon Посмотреть сообщение
Цитата Сообщение от dzrkot Посмотреть сообщение
то подгружать из этого файла новую инфу
файловые операции самые затратные
ну ок, значит хранить буду весь массив в памяти, а рисовать по нему только его определённую область
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.07.2014, 11:51 5
Цитата Сообщение от dzrkot Посмотреть сообщение
по поводу сцены - пытался на ней рисовать, но она начинает всё как-то центровать, и в итоге где что оказывается я не понимаю
Ничего сцена не должна центрировать. Там используются обычные декартовые координаты (только ось Y сверху вниз направлена).

Не по теме:


А вообще судя по вашим знаниям Qt и матчасти вообще, вам еще рано пытаться какие-то сложные проекты писать. Почитайте литературу по Qt. Разберитесь со всем. С классами работы с графикой. С реализацией анимации.
ИМХО. По незнанию сами себе насоздаете кучу проблем в процессе разработки. И конечный результат наверняка будет далек от совершенства!

1
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
25.07.2014, 12:10  [ТС] 6
Цитата Сообщение от alexey_rage Посмотреть сообщение
А вообще судя по вашим знаниям Qt и матчасти вообще, вам еще рано пытаться какие-то сложные проекты писать. Почитайте литературу по Qt. Разберитесь со всем. С классами работы с графикой. С реализацией анимации.
ИМХО. По незнанию сами себе насоздаете кучу проблем в процессе разработки. И конечный результат наверняка будет далек от совершенства!
ну вообщем-то то, чем я сейчас занимаюсь это и есть подтягивание матчасти и разбирательство с QT, я не ставлю сделать что-то грандиозное, я разбираюсь с той же графикой сейчас, просто времени к сожалению свободного мало, поэтому иной раз я задаю тупые вопросы на форуме т.к. искать ответы времени действительно нет, я вот всё это делаю или в обед на работе, или по утрам перед работой с кофе, либо ночью когда жена спит, и читаю я в основном в метро или в транспорте. Так что за мои знания вы меня простите, я исправлюсь)

Добавлено через 2 минуты
Цитата Сообщение от alexey_rage Посмотреть сообщение
Ничего сцена не должна центрировать. Там используются обычные декартовые координаты (только ось Y сверху вниз направлена).
Координаты в QGraphicsView
мб я неправильно понял слова avazarta ..
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.07.2014, 12:29 7

Не по теме:


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



Добавлено через 10 минут
Цитата Сообщение от dzrkot Посмотреть сообщение
Задача - нарисовать 1 объект QImag поверх другого объекта QImag. Как это сделать ...?
Вот хотя бы конкретный совет. Не нужно рисовать один QImage поверх другого. Просто создать два отдельных QGraphicsItem и установить для каждого значение слоя через setZValue(int).
Чем больше значение, тем выше слой. То есть айтем с большим значением слоя будет отображаться поверх айтема с меньшим значением слоя.

По поводу прозрачности, лучше наверное сконвертировать все .jpg в .png и сделать нужные пиксели прозрачными в каком-то редакторе.
Но, если у вас на всех картинках одинаковый цвет фона, который должен быть прозрачным, то можно написать на Qt утилитку, которая будет автоматом находить пиксели нужного цвета и задавать для них значение альфа-канала на максимум прозрачности. QImage и QColor имеют все необходимые методы для реализации этой задачи.
Но .jpg в любом случае нужно конвертировать в .png (или .gif)
0
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
25.07.2014, 12:50  [ТС] 8
Цитата Сообщение от alexey_rage Посмотреть сообщение
Вот хотя бы конкретный совет. Не нужно рисовать один QImage поверх другого. Просто создать два отдельных QGraphicsItem и установить для каждого значение слоя через setZValue(int).
Чем больше значение, тем выше слой. То есть айтем с большим значением слоя будет отображаться поверх айтема с меньшим значением слоя.
По поводу прозрачности, лучше наверное сконвертировать все .jpg в .png и сделать нужные пиксели прозрачными в каком-то редакторе.
Но, если у вас на всех картинках одинаковый цвет фона, который должен быть прозрачным, то можно написать на Qt утилитку, которая будет автоматом находить пиксели нужного цвета и задавать для них значение альфа-канала на максимум прозрачности. QImage и QColor имеют все необходимые методы для реализации этой задачи.
Но .jpg в любом случае нужно конвертировать в .png (или .gif)
да в png уже перевёл вчера, и впринципе уже отрисовывалось всё нормально, но решил по вашим советам делать всё со сценой.
Создал QPixmap , в них загрузил изображения, потом создал QGraphicsPixmapItem , установил в них эти QPixman , сделал сцену и прикрепил к виджету, теперь пытаюсь разобраться как это всё вывести на сцену через QGraphicView

Добавлено через 8 минут
собственно опять всё что я добавляю на сцену рсиуется в середине перекрывая друг друга...
C++ (Qt)
1
2
  scene.addItem(&Map.GRgrass);
  scene.addItem(&Map.GRtrees);
setPos класса QGraphicsPixmapItem решил проблему, но всёравно рисуется всё с координатами 0,0 в середине, а не в верхнем левом углу
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.07.2014, 12:55 9
Цитата Сообщение от dzrkot Посмотреть сообщение
теперь пытаюсь разобраться как это всё вывести на сцену через QGraphicView
C++ (Qt)
1
2
3
4
QGraphicsView *view = new QGraphicseView();
QGraphicsScene *scene = new QGraphicsScene();
scene->setSceneRect(0, 0, 800, 600); // , где 0,0 - rоординаты левого верхнего угла, 800 - ширина, 600 - высота.
view->setScene(scene);
Ну а дальше добавляем айтемы в сцену через scene->addItem()
1
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
25.07.2014, 13:03  [ТС] 10
спасибо, до того момента уже дошёл, а теперь вот:

я правильно понимаю, что чтобы заполнить сцену скажем 120 на 120 фигурами 40 на 40 мне нужно создать 9 отдельных фигур и добавить их на сцену? как-то странно...

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
scene.setSceneRect(0, 0, 700, 500);
  view.setScene(&scene);
  vbl.addWidget(&view);
 
  for(int i=0;i<sizex;i++){
     {
     for(int j=0;j<sizey;j++)
       {
       switch(Map.fieldMap[i][j])
         {
         case 1:
           Map.GRgrass.setPos(x,y);
           scene.addItem(&Map.GRgrass);
         break;
         case 2:
           Map.GRtrees.setPos(x,y);
           scene.addItem(&Map.GRtrees);
         break;
         }
       x+=40;
       }
     x=0;
     y+=40;
     }
  this->setLayout(&vbl);
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
25.07.2014, 13:34 11
А что тут странного?
0
zzzZZZ...
526 / 357 / 94
Регистрация: 11.09.2013
Сообщений: 2,040
26.07.2014, 20:52  [ТС] 12
Цитата Сообщение от alexey_rage Посмотреть сообщение
А что тут странного?
ну для меня непонятно как с этим работать...
скажем нарисовал я карту, добавив в неё 13*18 указателей на QGraphicPixmapItem , затем я пытаюсь подвинуть карту использую клавиши. Вот тут у меня возникает вопрос, как мне удалить 13 или 18 крайних QGraphicPixmapItem - ов , потом вызвать setPos для остальных QGraphicPixmapItem -ов и добавить новых в область куда мы передвинулись...
Или можно сразу отрисовать всё, и потом уже двигать отображаемую область...Просто хз скажем если это 600*600 == 360000 нецелесообразно это всё держать в памяти постоянно...
0
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
17.08.2014, 00:48 13
Цитата Сообщение от dzrkot Посмотреть сообщение
Или можно сразу отрисовать всё, и потом уже двигать отображаемую область...Просто хз скажем если это 600*600 == 360000 нецелесообразно это всё держать в памяти постоянно...

Не по теме:

Был в отпуске без доступа к интернету, поэтому отвечаю с опозданием.


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

Добавлено через 23 часа 39 минут
Например вот так можно описать метод получения видимой области сцены через метод QGraphicsView::mapToScene()

C++ (Qt)
1
2
3
4
5
6
QRectF getVisibleSceneRect()
{
    QPointF topleft = mapToScene(0,0);  // Левый верхний угол QGraphicsView
    QPointF bottomRight = mapToScene(width, height); // Правый нижний угол QGraphicsView
    return QRectF(topleft, bottomRight);
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2014, 00:48

Как сохранить QImage (Qt) в lplImage (OpenCV)?
Как сохранить QImage (Qt) в lplImage (OpenCV)?

Измерения рисунка как фон формы
Добрый день, решил в БД добавить поздравление при наступлении определенной даты, создал форму, на...

Как сделать выделение и перемещение части изображения (QImage)?
Я пытаюсь создать свой графический редактор (что-то вроде Paint'a). Необходимо сделать выделение...

QImage::setPixel
#include &lt;QtCore/QCoreApplication&gt; #include &lt;QPaintDevice&gt; #include &lt;QImage&gt; #include &lt;QRgb&gt;...

QImage - чтение
Здравствуйте, скажите в чем ошибка? Не могу &quot;прочитать пиксели&quot; - выдает отрицательные значения. ...

QImage load
QImage g for (int i = 0; i &lt; n; ++i) { g.load(&quot;.//images/img&quot; + i + &quot;.png&quot;); } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.