Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: StatuS74 от Октябрь 26, 2011, 11:29



Название: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 11:29
Возникла проблема. есть 2 сцены их надо сохранить одним графиком. по штучно всё ок сохраняет. а вот что бы из 2-х сцен получилась одна картинка не знаю как сделать. мб кто то сталкивался с подобным ?


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 11:36
Как-то так:
Код
C++ (Qt)
QImage img;
QPainter p( &img );
 
scene1->render( &p );
scene2->render( &p );


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 12:09
сделал вот так

Код:
 QImage img;
                img.fill(QColor(Qt::white).rgb());
                QPainter p( &img );

                scene->render( &p );
                scene2->render( &p );
                img.save(QString("/Graphic_test/%1.PNG").arg(serial1_1));
но не объединяет и не сохраняет =)


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 12:11
Ну а кто размер и формат картинки будет задавать?
Ты что под root-ом тестики пишешь, коли тебе позволительно писать в /Graphic_test  ???


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 12:14
 а как задать формат на 2 сразу ? допустим на 1 я задаю формат вот так
Код:
QImage image(scene->width(), scene2->height(), QImage::Format_ARGB32_Premultiplied);
а как на 2 сразу я чето не знаю


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 12:20
а как задать формат на 2 сразу ? допустим на 1 я задаю формат вот так
Код:
QImage image(scene->width(), scene2->height(), QImage::Format_ARGB32_Premultiplied);
а как на 2 сразу я чето не знаю
Нужен результирующий размер картинки, а не размер сцены. Сцена будет масштабироваться под размеры картинки при рендеринге.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 12:49
сделал как ты сказал но что то не работает

Код:
 QImage img(scene->width(), scene2->height(), QImage::Format_ARGB32_Premultiplied);
                img.fill(QColor(Qt::white).rgb());
                QPainter p( &img );
                scene->render( &p );
                scene2->render( &p );
                img.save(QString("/Graphic_test/%1.PNG").arg(serial1_1));

Для контроля сделал сохранение поштучно сохраняет а объединение не проходит


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 12:55
А ты писать-то в /Graphic_test можешь?
И зачем интересно тебе в этом случае альфа-канал?


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 12:56
писать в эту папку могу. а альфа эм... в книжке пример видел вот решил его использовать


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 13:01
Для контроля сделал сохранение поштучно сохраняет а объединение не проходит
Попробуй тогда так:
Код
C++ (Qt)
Painter p;
p.begin( &img );
 scene->render( &p );
p.end();
p.begin( &img );
 scene2->render( &p );
p.end();
Но и это будет работать при условии, что у тебя вторая сцена не имеет элемента, который перекрывает всю сцену.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 13:02
у меня 2 сцены примерно одинакового размера


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 13:21
сделал вот так
Код:
 QImage img(scene->width(), scene2->height()*2, QImage::Format_ARGB32_Premultiplied);
                img.fill(QColor(Qt::white).rgb());
                QPainter p( &img );
                p.end();
                scene->render( &p );
                scene2->render( &p );
                img.save(QString("/Graphic_test/%1.PNG").arg(serial1_1));
сохраняет только вторую сцену ... хм...


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 13:49
Поменяй порядок сцен или заполняющий цвет.
Скорее всего во 2-й сцене есть элемент, который перекрывает всю сцену.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 13:52
поменял местами тперь сохраняется только вторая сцена.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 13:55
мне кажется что этими действиями сцены как бы не объеденяюсться а заменяются


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 13:58
во засек... получается так что одна сцена ложится на другу сцену.


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 14:44
мне кажется что этими действиями сцены как бы не объеденяюсться а заменяются
Чушь. И причём здесь вообще объединение ??? Ведь делается простое последовательное наложение.

Вот тебе рабочий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QImage>
#include <QPainter>
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QGraphicsScene scene1, scene2, scene3;
 
scene1.setSceneRect( -250, -250, 500, 500 );
scene2.setSceneRect( -250, -250, 500, 500 );
scene3.setSceneRect( -250, -250, 500, 500 );
 
scene1.addRect( QRectF( -200, -200, 400, 400 ), QPen( Qt::black ), QBrush( Qt::green ) );
scene2.addEllipse( -150, -150, 300, 300, QPen( Qt::black ), QBrush( Qt::red ) );
 
QGraphicsItem* pi = scene3.addRect(
QRectF( -50, -50, 100, 100 ), QPen( Qt::black ), QBrush( Qt::blue ) );
pi->setRotation( 45 );
 
QImage img( 800, 600, QImage::Format_RGB32 );
img.fill( QColor( Qt::white ).rgb() );
 
QPainter p( &img );
p.setRenderHint( QPainter::Antialiasing );
 
scene1.render( &p );
scene2.render( &p );
scene3.render( &p );
 
img.save( "/tmp/test.png" );
 
return 0;
}
 

Ещё раз повторяю, что на второй сцене есть либо элемент, который перекрывает всю сцену либо выставлен QGraphicsScene::backgroundBrush() либо перегружен QGraphicsScene::drawBackground(), который затирает фон.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 26, 2011, 14:48
да у меня есть  scene->setBackgroundBrush(Qt::black);


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 26, 2011, 14:51
да у меня есть  scene->setBackgroundBrush(Qt::black);
Ну и чего спрашивается ты тогда удивляешься результату ???


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 07:02
убрал все заливки фона но все равно такая фигня что один на другой накладывается =(

(http://)


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 27, 2011, 07:32
убрал все заливки фона но все равно такая фигня что один на другой накладывается =(
Ты это типа прикалываешься?
А ты разве не этого хотел?
Или всё-таки хотел, чтобы графики располагались один под другим?


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 07:55
я имел в виду что бы один под другим был


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 27, 2011, 10:17
я имел в виду что бы один под другим был
Особенно это видно из первого сообщения
Цитировать
есть 2 сцены их надо сохранить одним графиком.
А прочитать описание QGraphicsScene::render() никак значит ???
Мде, слов нет... ???


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 10:33
я читал про это. одно не понятно. там не указано как совмешать сцены. судя приму который там есть я могу манипулировать только с одной сценой.


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 27, 2011, 10:41
я читал про это. одно не понятно. там не указано как совмешать сцены. судя приму который там есть я могу манипулировать только с одной сценой.
Скоро матом начну ругаться...
Ещё раз внимательно читаем описание QGraphicsScene::render() (http://www.doc.crossplatform.ru/qt/4.7.x/qgraphicsscene.html#render):
Цитировать
void QGraphicsScene::render ( QPainter * painter, const QRectF & target = QRectF(), const QRectF & source = QRectF(), Qt::AspectRatioMode aspectRatioMode = Qt::KeepAspectRatio )

Отображает прямоугольник сцены source в target используя painter. Эта функция полезна для записи содержимого сцены в устройство рисования, такое как QImage (например, сделать снимок экрана), или для печати в QPrinter. Например:

 QGraphicsScene scene;
 scene.addItem(...
 ...
 QPrinter printer(QPrinter::HighResolution);
 printer.setPaperSize(QPrinter::A4);

 QPainter painter(&printer);
 scene.render(&painter);

Если source это пустой прямоугольник, эта функция будет использовать sceneRect() для определения что ей отрисовывать. Если target это пустой прямоугольник, то будут использованы размеры устройства рисования painter.

Содержимое прямоугольника источника будет преобразовано в соответствии с aspectRatioMode для размещения в прямоугольнике назначения. По-умолчанию соотношение сторон сохраняется, а source масштабируется чтобы размещаться в target.
Так вот target - это область в картинке куда будет отрисовываться сцена.


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 11:07
понимаю что всех достал уже, но подскажите компилятор ругается что не те значения указываю.

Код:
 scene->render( &p, QRectF (80,0 ));
 scene2->render( &p , QRectF (80,301));


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 27, 2011, 11:11
Под рукой есть ассистент?
Что написано в описании конструктора QRectF?


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 11:13
ааа координаты верхнего угла задавать 2 точками надо и нижнего также =)


Название: Re: Объединение сцен
Отправлено: GreatSnake от Октябрь 27, 2011, 11:45
Вот тебе ещё рабочий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QImage>
#include <QPainter>
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
QGraphicsScene scene1, scene2, scene3;
 
scene1.addRect( QRectF( -200, -200, 400, 400 ), QPen( Qt::black ), QBrush( Qt::green ) );
scene2.addEllipse( -200, -200, 400, 400, QPen( Qt::black ), QBrush( Qt::red ) );
 
QGraphicsItem* pi = scene3.addRect(
QRectF( -150, -150, 300, 300 ), QPen( Qt::black ), QBrush( Qt::blue ) );
pi->setRotation( 45 );
 
QImage img( 500, 1400, QImage::Format_RGB32 );
img.fill( QColor( Qt::white ).rgb() );
 
QPainter p( &img );
p.setRenderHint( QPainter::Antialiasing );
 
scene1.render( &p, QRectF( 50, 50, 400, 400 ) );
scene2.render( &p, QRectF( 50, 500, 400, 400 ) );
scene3.render( &p, QRectF( 50, 950, 400, 400 ) );
 
img.save( "/tmp/test.png" );
 
return 0;
}
 
Ежели и после него будут вопросы, то уже не ко мне, ибо надоело...


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 11:59
Спасибо тебе за помощь. я сделал вот так. все работает класс

Код:
 QImage img(scene->width(), scene2->height()*2.5, QImage::Format_RGB32);
                img.fill(QColor(Qt::black).rgb());
                QPainter p( &img );

                scene->render( &p, QRectF (0,img.height()/20,img.width(),img.height()/2));
                scene2->render( &p, QRectF (0,img.height()/2,img.width(),img.height()/2));

                p.end();
                img.save(QString("/Graphic_test/%1.PNG").arg(serial1_1));



Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 12:01
ещё не понятно почему он сохраняет на диск C: в папку которую указал. а не в папку где находится запускающий exe фаил.


Название: Re: Объединение сцен
Отправлено: Пантер от Октябрь 27, 2011, 12:34
ещё не понятно почему он сохраняет на диск C: в папку которую указал. а не в папку где находится запускающий exe фаил.
Голова существует не только для того, чтобы в нее есть.
Гугли относительные пути или юзай QCoreApplication::applicationDirPath ().


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 27, 2011, 13:27
сделал вот так

Код:
QDir adr;
QString put = adr.currentPath();
image.save(QString(put + "/Temp/%1_тест №2_.PNG").arg(ser_mumb));


Название: Re: Объединение сцен
Отправлено: kambala от Октябрь 27, 2011, 15:11
если пользователь удалит папку Temp, то будет фэил


Название: Re: Объединение сцен
Отправлено: StatuS74 от Октябрь 28, 2011, 05:56
согласен.Ты прав как никогда =) но программа не начнет работать если этой папке нет