Russian Qt Forum
Сентябрь 21, 2024, 14:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не могу вывести Pixmap  (Прочитано 14650 раз)
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);

но мне нужно отображение рисунка из массива.
Что не так?
Записан
GrolfCry
Гость
« Ответ #1 : Сентябрь 02, 2005, 10:36 »

а чем не устраивает
Код:

QPixmap pm("2.png");
Записан
andrek
Гость
« Ответ #2 : Сентябрь 02, 2005, 10:52 »

QPixmap::loadFromData отлично справляется с static const unsigned char[]
Записан
Zmey
Гость
« Ответ #3 : Сентябрь 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,........

работает. Но вот мои распакованные данные не показывает.
Записан
Zmey
Гость
« Ответ #4 : Сентябрь 02, 2005, 15:15 »

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

bmp без заголовка?
а палитра есть?
выводи по точкам

от какой игрухи ресурсы ломаем?
Записан
Zmey
Гость
« Ответ #6 : Сентябрь 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, но у меня не получается. Может кто-нить даст пример?
Записан
Keiko
Гость
« Ответ #7 : Сентябрь 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()
Записан
Keiko
Гость
« Ответ #8 : Сентябрь 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() (что, в приципе одно и тоже).
Записан
ppk
Гость
« Ответ #9 : Август 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 - тоже ничего.
Подскажите, где ошибаюсь?
Заранее спасибо за помощь
Записан
ритт
Гость
« Ответ #10 : Август 21, 2009, 14:08 »

ba = (char *) buffer; - что за бред?

и попробуй QPixmap заменить на QImage
Записан
ppk
Гость
« Ответ #11 : Август 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);

Результат тот же.
Записан
ритт
Гость
« Ответ #12 : Август 21, 2009, 16:14 »

!rtfm: QByteArray::fromRawData
Записан
ppk
Гость
« Ответ #13 : Август 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.
Подскажите, где ошибаюсь?
Записан
BRE
Гость
« Ответ #14 : Август 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 не использует палитру, то размер нужно умножить на количество байт используемых для хранения цвета.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 21.