Russian Qt Forum

Qt => Мультимедиа => Тема начата: Zmey от Сентябрь 02, 2005, 09:05



Название: Не могу вывести Pixmap
Отправлено: Zmey от Сентябрь 02, 2005, 09:05
Мне нужно показывать изображение из массива unsigned char (или из QByteArray).
Вот мой код:
   
Код:
uchar* ui32t;
QImage* ImageImaget  = new QImage(128,128,32);
ImageImaget->setAlphaBuffer(TRUE);
bool t=ImageImaget->load("2.png","PNG");
int nb=ImageImaget->numBytes();
ui32t=ImageImaget->scanLine(0);
QPixmap pm;
pm.loadFromData(ui32t,nb,"PNG",(int)0);
textLabelMovie->setPixmap(pm);

Если делаю так, то работает:
   
Код:
QPixmap pm;
  pm.load("2.png","PNG",0);
textLabelMovie->setPixmap(pm);

но мне нужно отображение рисунка из массива.
Что не так?


Название: Не могу вывести Pixmap
Отправлено: GrolfCry от Сентябрь 02, 2005, 10:36
а чем не устраивает
Код:

QPixmap pm("2.png");


Название: Не могу вывести Pixmap
Отправлено: andrek от Сентябрь 02, 2005, 10:52
QPixmap::loadFromData отлично справляется с static const unsigned char[]


Название: Не могу вывести Pixmap
Отправлено: Zmey от Сентябрь 02, 2005, 13:16
Есть запакованный файл с изображением, я его беру, распаковываю его через zlib, в итоге у меня есть QByteArray и его надо отобразить.
Запись типа такого:
Код:
static const unsigned char image_bmp_data[] = {
    0x42,0x4d,0xc2,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x00,0x00,0x00,
    0x28,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x01,0x00,
    0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x04,0x00,0x00,0x6d,0x0b,0x00,0x00,
    0x6d,0x0b,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
    0x10,0x00,0xff,0xff,0xff,0x00,0x51,0x61,0x30,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
    0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
    0x10,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x10,
    0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x00,0x10,0x10,0x10,
    0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,........

работает. Но вот мои распакованные данные не показывает.


Название: Не могу вывести Pixmap
Отправлено: Zmey от Сентябрь 02, 2005, 15:15
Короче говоря, есть массив m*n*4 типа unsigned char, не важно откуда он получен, просто есть. Нужно теперь отобразить этот массив как изображение  m - высота, n - ширина, 4 - глубина цвета.
Подскажите, кто знает.


Название: Не могу вывести Pixmap
Отправлено: andrek от Сентябрь 02, 2005, 15:38
bmp без заголовка?
а палитра есть?
выводи по точкам

от какой игрухи ресурсы ломаем?


Название: Не могу вывести Pixmap
Отправлено: Zmey от Сентябрь 02, 2005, 16:34
Цитата: "andrek"
bmp без заголовка?
а палитра есть?
выводи по точкам

от какой игрухи ресурсы ломаем?

Массив это просто массив, никакого заголовка, просто набор цифр, допустим это просто поток из платы ввода видеоданных. ;)
Сделал таки, из массива получил QImage:
Код:
//ui32t - массив 128*128*4 uchar с нашими данными
//nb=128*128*4
QImage* i2  = new QImage(128,128,32);
i2->setAlphaBuffer(TRUE);
uchar* pi2=i2->scanLine(0);
memcpy(pi2,ui32t,nb);

Как теперь максимально быстро вывести его на экран?
Можно через QLabel, но он выводит только QPixmap, а функция QPixmap::convertFromImage как написано в ассистансе There are (slow) functions to convert between QImage and QPixmap: convertToImage() and convertFromImage().
Как просто вывести на форму QImage? Вроде как то через QPainter или через BitBlt, но у меня не получается. Может кто-нить даст пример?


Название: Re: Не могу вывести Pixmap
Отправлено: Keiko от Сентябрь 03, 2005, 00:08
блин, что за бред ?

Цитата: "Zmey"

   
Код:
uchar* ui32t;
QImage* ImageImaget  = new QImage(128,128,32);
ImageImaget->setAlphaBuffer(TRUE);
bool t=ImageImaget->load("2.png","PNG");



Создал изображение QImage, потом его перезаписал с помощью QImage::load()

Цитата: "Zmey"

           
Код:

int nb=ImageImaget->numBytes();
ui32t=ImageImaget->scanLine(0);
QPixmap pm;
pm.loadFromData(ui32t,nb,"PNG",(int)0);
textLabelMovie->setPixmap(pm);



Получил указатель на 32-битную НЕСЖАТУЮ область памяти, потом зачем-то вызвал loadFromData с параметром "PNG".

Цитата: "Zmey"
Если делаю так, то работает:
   
Код:
QPixmap pm;
  pm.load("2.png","PNG",0);
textLabelMovie->setPixmap(pm);



Конечно это будет работать, т.к. ты загрузил пиксмап из файла напрямую.

P.S. См. внимательно QPIxmap::convertFromImage(), QImage::load()


Название: Не могу вывести Pixmap
Отправлено: Keiko от Сентябрь 03, 2005, 00:10
Цитата: "Zmey"
Короче говоря, есть массив m*n*4 типа unsigned char, не важно откуда он получен, просто есть. Нужно теперь отобразить этот массив как изображение  m - высота, n - ширина, 4 - глубина цвета.
Подскажите, кто знает.


Код:

QImage::QImage ( uchar * yourdata, int w, int h, int depth, int bpl, QRgb * colortable, int numColors, Endian bitOrder )

Constructs an image that uses an existing memory buffer. The buffer must remain valid for the life of the QImage. The image does not delete the buffer at destruction. The buffer is passed as yourdata. The image's width is w and its height is h. The color depth is depth. bpl specifies the number of bytes per line.

If colortable is 0, a color table sufficient for numColors will be allocated (and destructed later).
The endianness is specified by bitOrder.


Потом QPainter::drawImage либо QPixmap::convertFromImage() + QPainter::drawPixmap() (что, в приципе одно и тоже).


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 21, 2009, 13:46
Здравствуйте. Решил поднять старую тему - проблема та же.
Есть массив данных, который объявляется, как unsigned char *buffer.
В этот буфер пишется картинка и далее буфер сохраняется в файл.
При попытке отобразить картинку из буфера на Qlabel ничего не получается, хотя из файла эта картинка отображается.
Делаю так:

Код:
QLabel *l = new QLabel();
QPixmap pm(720,576);
QByteArray ba;
//буфер не пустой и имеет размер 720*576
ba = (char *) buffer;
//ba после присваивания в отладчике показывает всего несколько строк - 
//гораздо меньше, чем исходный буфер

pm.loadFromData(ba);
l->setPixmap(pm);
l->show();

пробовал напрямую грузить pm.loadFromData из buffer - тоже ничего.
Подскажите, где ошибаюсь?
Заранее спасибо за помощь


Название: Re: Не могу вывести Pixmap
Отправлено: ритт от Август 21, 2009, 14:08
ba = (char *) buffer; - что за бред?

и попробуй QPixmap заменить на QImage


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 21, 2009, 14:40
ba = (char *) buffer; - что за бред?

и попробуй QPixmap заменить на QImage

А как правильно?
Я пробовал и через ba.append((char *) buffer);
И так
Код:
QDataStream ds(&ba,QIODevice::WriteOnly);
char * cs = (char *) buffer;
ds.writeBytes((char *) buffer,720*576);

Результат тот же.


Название: Re: Не могу вывести Pixmap
Отправлено: ритт от Август 21, 2009, 16:14
!rtfm: QByteArray::fromRawData


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 23, 2009, 18:55
Делаю так:
Код:
QLabel *l = new QLabel();
QPixmap pm(720,576);
const char *cs = (char *) buffer;
QByteArray ba = QByteArray::fromRawData(cs,720*576);
pm.loadFromData(ba);
l->setPixmap(pm);
l->show();

Ничего не получается.
Под отладчиком видно, что ba после выполнения fromRawData не пустой, но его размер гораздо меньше cs.
Подскажите, где ошибаюсь?


Название: Re: Не могу вывести Pixmap
Отправлено: BRE от Август 23, 2009, 19:12
Делаю так:
Код:
QLabel *l = new QLabel();
QPixmap pm(720,576);
const char *cs = (char *) buffer;
QByteArray ba = QByteArray::fromRawData(cs,720*576);
pm.loadFromData(ba);
l->setPixmap(pm);
l->show();

Ничего не получается.
Под отладчиком видно, что ba после выполнения fromRawData не пустой, но его размер гораздо меньше cs.
Подскажите, где ошибаюсь?
Если картинка в buffer не использует палитру, то размер нужно умножить на количество байт используемых для хранения цвета.


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 23, 2009, 19:56
Вот, как выглядит ba после
QByteArray ba = QByteArray::fromRawData(cs,720*576):

"\1c\1c\1c\1c\1b\19\18\1c"\c\198\1d\1b\c\12\18\15\12\11\11\13\16\1a\1d\1d\1d\1d\1c\1a\18\16\15\18\1b\1f!! \1e\1d\1e !"!\1e\1c\1a\1a\1b\1d\1e!#&'%"\1e\1c\1c\1d\1f \1e\1c\1a\19\1a\1c\1e\1f\1e\1c\1b\19\19\19\19\1a\1b\1c\1d\1e\1f\1f\1f\1f\1f   \1f\1f\1f\1f "#\b"\cd\ee5\e3\bd\b4r\eb"

Исходный буфер гораздо больше и соответствует размеру 720*576. Вот его начало:
0x9145460 "\034\034\034\034\033\031\030\034\"\f\0318\035\033\f\022\030\025\022\021\021\023\026\032\035\035\035\035\034\032\030\026\025\030\033\037!! \036\035\036 !\"!\036\034\032\032\033\035\036!#&'%\"\036\034\034\035\037 \036\034\032\031\032\034\036\037\036\034\033\031\031\031\031\032\033\034\035\036\037\037\037\037\037   \037\037\037\037 \"#$#! \036\034\033\032\032\033\034\036  !!\"#$%%#\" \036\037  !! \037\035\036\036\036\035\034\032\031\030\032\034\036\037 \037! \025\f\025!##$$\" \035\033\035\037\"$#!\037\036\035\035\035\034\032\027\025\024\026\031\034\036\037\037\037\037\037\037\036\036\035\035\034\033\031\026\024\023\023\023\022\022\027\034\033\027\r\005\b\020\031 \034\030\034\"&(('%\"\037\034\030\026\030\033\034\032\024\016\r\016\020\022\023\025\027\030\031\032\034\035\037\037\035\032\026\024\032!!  !+2-%\034\026\034\"\027\016\024\034\035\034\033\032\032\032\032\033\034\037'2CROHA=BJQVTNIDCCCDHKOQPMJF@;7447;BKYx\224\227\222\216\213\216\222\223\224\225\226\227\230\232\235\241\246\255\265\276\305\307\306\304\301\276\272\265\251~]\201\252\244\226\223\220\206\200\221\246\270\303\271\253\255\262\263\264\266\267\270\270\270\267\265\263\257\252\245\244\251\260\267\275\276\275\274\273\273\273\273\274\274\275\276\275\272\266\264\263\263\267\304\321\321\317\315\313\314\315\316\316\316\316\315\315\314\314\314\313\313\312\306\304\322\335\322\305\307\313\315\316\315\313\312\310\307\306\303\307\336\366\375\376\377\372\356\303\302\352\307\315\310\311\311\311\312\313\320\323\312\305\324\345\350\345\330\312\307\303\302\313\311\310\310\307\307\306\303\277\274\266\250\232\216\213\241\272\303\307\310\306\306\305\303\301\301\301\301\276\261\243\225\215\225\244\263\300\305\307\311\310\305\300\273\267\270\274\302\303\251\217\214\225\255\304\304\277\301\302\277\274\275\276\272\267\274\275\254\226\201w\220\257\301\312\301\266\266\270\266\265\265\266\267\267\270\271\272\274\275\277\300\300\277\274\272\267\264\262\260\257\261\265\270\272\273\273\272\271\271\270\267\266\264\263\261\260\257\256\255\254\253\253\252\252\252\253\254\255\255\256\257\257\256\254\251\247\245\243\242\241\242\244\247\250\247\246\244\242\241\240\237\237\240\242\244\245\244\242\240
...


Попытка увеличить размер в 2 или 4 раза выводит сообщение, что ba находится вне области видимости.


Название: Re: Не могу вывести Pixmap
Отправлено: ритт от Август 23, 2009, 21:22
и кто такое cs?


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 23, 2009, 21:31
unsigned char *buffer
...
const char *cs = (char *) buffer;

Я немного ранее приводил кусок кода


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 23, 2009, 22:01
Посмотрел код по сохранению этого буфера в файл в чужой библиотеке.
Перед сохранением в начала буфера добавляется строка:
"P5\n720 576\n255\n"
Сделал у себя также:
QByteArray p("P5\n720 576\n255\n");
QByteArray ba =  QByteArray::fromRawData(cs,720*576).prepend(p);

И все получилось.
Может быть кто-нибудь подскажет почему без этой строки QPixmap не хочет отображать картинку?


Название: Re: Не могу вывести Pixmap
Отправлено: ритт от Август 24, 2009, 00:12
строка QByteArray ba =  QByteArray::fromRawData(cs,720*576).prepend(p); стала бессмысленной.
"P5\n720 576\n255\n" - какая-то сигнатура?


Название: Re: Не могу вывести Pixmap
Отправлено: ppk от Август 24, 2009, 09:24
Что означает эта строка не знаю, поэтому и спрашиваю, но она пишется в начало файла перед буфером, если буфер сохраняется в файл.
Там явно прослеживаются размеры изображения 576 X 720.