Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: ¤Se®ega¤ от Апрель 15, 2009, 13:42



Название: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 13:42
Подскажите как передать картинку, нарисованную при помощи OpenGl.Например из приложения в приложение,ну или даже из одного класса в другой.


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 13:49
из класса в класс: по указателю, по ссылке.
по-подробнее можно?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 13:52
мня интересует не средства для передачи. меня больше интересует ЧТО передать.
Поподробнее:
одник класс генерит изображение
второй класс это изображение принимает и иотображает посредством Opengl.


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 13:53
ничего не понял опять.  :) QPixmap или QImage передавай.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 13:56
я только начинаю изучать, вот и сам не понимаю как сделать.мне необходимо в одной программе генерить какое-либо изображение (ye например просто вращение фигуры), в другой программе это изображение обображать.ЧТобы генерация/отображение были быстрее использовать надо Opengl/


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:01
берешь грабишь виджет где идет отрисовка при помощи QPixmap::grabWindow,
затем сохраняешь полученный результат в QByteArray вот таким образом
Код
C++ (Qt)
QPixmap pixmap;
QByteArray bytes;
QBuffer buffer(&bytes);
buffer.open(QIODevice::WriteOnly);
pixmap.save(&buffer, "PNG");
 
затем шлешь этот байтАррей куда надо.
в получающей проге делаешь обратную операцию про помощи QImage::fromData и отображаешь где надо.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:03
а можно ну уж совсем подробно про QPixmap::grabWindow?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:05
точнее про операцию перехвата  ::)


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:14
1.получение картинки
Код
C++ (Qt)
QPixmap MyGLRenderer::takeScreenShot() const
{
        return QPixmap::grabWindow(winId());//отличие этого метода от grabWidget в том,
        //что все окно (вместе с title и т.д.) будет сохранено в пиксмап. тут уже решай сам нужны ли тебе декорации
}
 
см. Screenshot Example в ассистанте
2.сохранение
Код
C++ (Qt)
QByteArray MyGLRenderer::imageToByteArray() const
{
        QPixmap pixmap = takeScreenShot();
        QByteArray bytes;
        QBuffer buffer(&bytes);
        buffer.open(QIODevice::WriteOnly);
        pixmap.save(&buffer, "PNG");
        return bytes;
}
 
3.отправка
ну тут тебе виднее как отправлять, через сокет, сохранение в файл.
4.восстановление изображения
Код
C++ (Qt)
...
QByteArray bytes = getScreenShot();//собственно функция получение изображения
QImage image = QImage::fromData(bytes, "PNG");
m_label->setPixmap(QPixmap::fromImage(image));
...
 


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:16
А рисовать я так понял надо в QPixmap?


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:17
где рисовать? grabWidget/grabWindow есть только у QPixmap.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:18
Генерируемую картинку рисовать при помощи Opengl я должен в QPixmap?


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:20
м...ты ж в QGLWidget работаешь с OpenGL на сколько я понимаю.
вот картинку этого окна тебе сделать и надо. или я опять нихрена не понял?  ???


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:21
Ну если в конечном итоге я должен отображить на QGLWdget, то думаю и генерить надо в подобном.


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:26
так давай сначала, что тебе нужно:

-- ты русиешь картинки в QGLWidget, затем эту картинку тебе нужно сохранить и отправить другому приложению и
уже там ее отобразить?

-- или тебе просто нужно в одном приложении сгенерить картинку и отправить другому?

-- ты хочешь использовать QGLWidget для рисование картинки или уже есть рабочая программа,
которая при помощи QGLWidget рендерит какую-то инфу, а тебе нужно делать скриншоты того, что она рендерит?

сформулируй нормально, что тебе нужно, пожалуйста, а то адекватного ответа будешь ждать долго.  :)


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:30
Мне необходимо передать из одного приложения в другое именно Картинку.Для получения этой картинки целесообразно использовать QGLWidget.
Прошу прощенье за запутывание касательно отображение на втором приложении в QGLWidget.


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:32
ясно. ну значит, как и говорил, сделай скриншот QGLWidget, где рендерится картинка ну и дальше по пунктам как я описывал.
разве, что отображать, если хочешь, можно не в QLabel, а в QGLWidget, хотя в последнем случае не вижу никакого выиграша. :)


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:43
еще мне бы желательно, чтобы все это происходило как можно быстрее. и еще несколько вопросов:
1) когда я буду делать pixmap.save(&buffer, "PNG"); получается что я сделаю скрин с моего QGLWidget окна(в котором будет вращаться фигурка), затем передам его в буфер, и буфер сохраню в pixmap в формате png?
2)передавать буду через сокет,как мне именно передать pixmap?
Если не влом :) хотелось бы разжованное все ) Итак конечно СПАСИБО ОГРОИНОЕ.НО если еще и это разжевать буду крайне признателен )))


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 14:47
еще мне бы желательно, чтобы все это происходило как можно быстрее. и еще несколько вопросов:
1) когда я буду делать pixmap.save(&buffer, "PNG"); получается что я сделаю скрин с моего QGLWidget окна(в котором будет вращаться фигурка), затем передам его в буфер, и буфер сохраню в pixmap в формате png?
да
2)передавать буду через сокет,как мне именно передать pixmap?
Если не влом :) хотелось бы разжованное все ) Итак конечно СПАСИБО ОГРОИНОЕ.НО если еще и это разжевать буду крайне признателен )))
писать в сокент нужно через QIODevice::write, т.е.
Код
C++ (Qt)
...
m_socket->write(imageToByteArray());
...
 


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 14:52
ОГРОМНОЕ СПАСИБИЩЕ.Сегодня буду пробовать.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 15:17
А можно генерить те же самые картинки, но не на окне, с которого берем скрин, а в памяти?


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 17:53
А можно генерить те же самые картинки, но не на окне, с которого берем скрин, а в памяти?
можно.
вот таким обрзом
Код
C++ (Qt)
...
QPixmap pixmap(100, 100);
QPainter painter(&pixmap);
painter.drawRect(10, 10, 90, 90);
...
 


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 17:57
Ну получается что там будет всегда одна и таже картинка.нет?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 17:59
И намного ли быстрее будет генерация в памяти чем, предыдущий метод?


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 18:01
я просто пример ривел. картинку ты можешь пересоздавать, не проблема.

на много-ли быстрее? если ты строишь 3D объекты, то быстрее конечно через OpenGL,
а если простенькие картинки, то можно и этим методом воспользоваться.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 18:34
можно еще вопрос касательно восстановления изображения.что должно быть в функции getScreenShot()?
и правильно ли я посылаю данные?
 void MyServer::sendToClient(QTcpSocket* pSocket, const QString& str)
{
QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_4);
arrBlock = imageToByteArray();
out<<quint16(arrBlock.size() - sizeof(quint16));
pSocket->write(arrBlock);
}


Название: Re: OpenGL
Отправлено: Alex Custov от Апрель 15, 2009, 18:52
мня интересует не средства для передачи. меня больше интересует ЧТО передать.
Поподробнее:
одник класс генерит изображение
второй класс это изображение принимает и иотображает посредством Opengl.

Я что-то не понял, если изображение уже есть, то почему бы его сразу не передать третьим сторонам? Изображение у тебя - это какая сущность? QImage? Массив байт?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 18:55
QGLWidget


Название: Re: OpenGL
Отправлено: Alex Custov от Апрель 15, 2009, 19:53
QGLWidget

QGLWidget это OpenGL контекст, в который ты что-то рисуешь. Как ты рисуешь картинку? Через текстуры или по-другому?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 20:02
Через  метод PaintGl графичискими примитивами


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 20:04
то spirit Спасибо, все заработало. только меня совсем не радует частота обновления  :-[ ну очень маленькая ((( ~1 кадра в секунду


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 20:20
то spirit Спасибо, все заработало. только меня совсем не радует частота обновления  :-[ ну очень маленькая ((( ~1 кадра в секунду
в смысле? частота обнавления где? на получателе?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 20:41
да, на приемнике, не сервере все нормально вращается с частотой порядка 60 fps, когда запускаю клиент, посылаю запрос, сервер приостанавливается на полсекунды, потом вращается дальше, на клиенте отображается то что было на сервере. У мена на клиенте стоит таймер, по которому я посылаю запросы, интервал таймера можно ставить в процессе работы.Так вот при таймере 999 оно вроде бы как еще кое как работает, но дальше хуже.


Название: Re: OpenGL
Отправлено: spirit от Апрель 15, 2009, 20:47
не понял почему останавливается.
покажи код, что на сервере происходит.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 20:58
я лучше скину и клиента и сервера: но там много написано ::)


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 15, 2009, 21:01
вот header'ы если надо.


Название: Re: OpenGL
Отправлено: spirit от Апрель 16, 2009, 08:29
кстати, в QGLWidget есть метод grabFrameBuffer лучше через него картинки получать.
а это способ, что сейчас у тебя используется выступает общим случаем.  :)


Название: Re: OpenGL
Отправлено: spirit от Апрель 16, 2009, 08:53
в общем добавь
Код
C++ (Qt)
...
const int Timeout = 5 * 1000;
pSocket->waitForBytesWritten(Timeout);
QApplication::processEvents();
...
 
в самый конец MyServer::sendToClient.
но лучше работу запись данных в сокет вынести в другой поток.
кстати, посмотри, что у тебя с отрисовкой не так, у меня в консоль валит такие мессаги
Цитировать
QPainter::restore: Unbalanced save/restore
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::save: Painter not active
QPainter::translate: Painter not active
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::setClipRect: Painter not active
QPainter::setPen: Painter not active
QPainter::pen: Painter not active
QPainter::begin: Paint device returned engine == 0, type: 1
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::save: Painter not active
QPainter::translate: Painter not active
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::pen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::setPen: Painter not active
QPainter::save: Painter not active
QPainter::translate: Painter not active
QPainter::setPen: Painter not active
QPainter::setBrush: Painter not active
QPainter::restore: Unbalanced save/restore
QPainter::begin: Paint device returned engine == 0, type: 1

в чем там дело, не разбирался.  :)


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 16, 2009, 14:16
Это я так понимаю, будет задержка 5 секунд прежде чем будет считан следующий пакет?


Название: Re: OpenGL
Отправлено: spirit от Апрель 16, 2009, 14:18
Это я так понимаю, будет задержка 5 секунд прежде чем будет считан следующий пакет?
нет, это максимальный таймаут, записаться может и быстрее.
короче, у меня через каждую секунду новая картинка приходила.


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 16, 2009, 14:31
вообще мне надо чтобы не за секунду а за 1/50 секунды.с помощью чего этого добиться можно? и почему так тормозщит все?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 17, 2009, 12:59
Я кажетс понял что тормозит, это сама генерация картинки imageToByteArray(); может есть способ как-нибудь генерить картинку другим образом, побыстрее?


Название: Re: OpenGL
Отправлено: ¤Se®ega¤ от Апрель 18, 2009, 01:39
а что можете сказать на счет использования renderPixmap(), там ведь и QPiaxmap::fromQImage даже не надо тогда делать???