Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QImage + массивы сырых данных 
:(
    Опции темы
maxi91m
Дата 23.4.2013, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Помогите разобраться в  Qimage

Есть трехмерный массив данных(данные могут быть целого не отрицательного типа)
Массив создан динамически, данные считаны из бинарного файла.

Необходимо добиться максимально быстрого отображения полученного данных в градациях серого.

Объясните как лучше передавать данные в QImage.

Данные в массиве в виде одного числа, как мне уложить это число в  QByteArray?
Если  QImage, как я понял хранит данные в виде пикселов(три компоненты), то мне надо размножить мое число(положим, что в массиве числа от 0-255)
Например есть число типа int  123 в массиве, тогда в массив  QByteArray мне необходимо записать три подряд одинаковых числа, чтобы задать значение одного пиксела,  ТАК?
int         QByteArray
123     (123 123 123)
 а так как QByteArray содержит char то мне необходимо сделать  преобразование типа из  int в char

Так все на самом деле, или нет?

Если устанавливать по писелам, то будет тормознуто?
Какой лучше виджет использовать для отображения QImage, если потом  поверх полученного изображения необходимо вывести еще графические данные(что то вроде линии, которая показывает место среза в других плоскостях), через которые можно будет управлять данными выводимыми на других виджетах?
--------------------
PM MAIL ICQ   Вверх
Jeka178RUS
Дата 23.4.2013, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Используй http://qt-project.org/doc/qt-4.8/qimage.html#QImage-4
с форматом QImage::Format_Indexed8

А теперь внимание вопрос: почему исходный массив трехмерный?
PM MAIL   Вверх
maxi91m
Дата 23.4.2013, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(Jeka178RUS @  23.4.2013,  18:24 Найти цитируемый пост)
А теперь внимание вопрос: почему исходный массив трехмерный? 

массив трехмерный, потому что данные в файле это значения снятые на МРТ, в трехмерном пространстве.
Каждый срез массива представляет какую то картинку, и ее надо вывести в градациях серого.

Пишу 
Код

unsigned char  bufffer[4] = {123,123,123,123};
    QByteArray arr((const char*)bufffer);
    QImage img(2, 2, QImage::Format_Indexed8);
    img.loadFromData(arr);
    QRgb rgb = img.pixel(1 ,1);
    QColor color(rgb);
    qDebug()<<color.red();


получаю

Код

QImage::pixel: coordinate (1,1) out of range
0
 


что я делаю не так?

Так получилось 
Код

 uchar  buffer[16] = {255,123,123,123,255,123,123,123,255,123,123,123,255,123,123,123};
QImage img((uchar*buffer, 4, 4, QImage::Format_Indexed8);



Но вопрос остается, что я делаю не так с  QByteArray

Это сообщение отредактировал(а) maxi91m - 23.4.2013, 19:19
--------------------
PM MAIL ICQ   Вверх
Amp
Дата 23.4.2013, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Format_Indexed8 подразумевает наличие палитры.
PM MAIL   Вверх
maxi91m
Дата 23.4.2013, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(Amp @  23.4.2013,  20:31 Найти цитируемый пост)
Format_Indexed8 подразумевает наличие палитры. 


Если передавать uchar  buffer[16] то все нормально(без установки палитры) пикселы закрашиваются, 
но не работает 
Код

 QRgb rgb = img.pixel(1 ,1);
    QColor color(rgb);
    qDebug()<<color.red();

а с QByteArray  не получается и просто вывести пикселы не получается.
--------------------
PM MAIL ICQ   Вверх
Amp
Дата 23.4.2013, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



У тебя loadFromData наверняка вернул 0, потому что он не принимает такие сырые данные.

Добавлено через 13 минут и 57 секунд
Как-то так. Причем надо учесть, что в исходном массиве данные должны быть выровнены на границу слова.

Код

uchar buffer[] = {0, 0, 0, 0, 1, 1, 0, 0};

QImage img(buffer, 2, 2, QImage::Format_Indexed8);

QVector<QRgb> palette;
palette.push_back(qRgb(255, 0, 0));
palette.push_back(qRgb(0, 128, 0));

img.setColorTable(palette);
    
qDebug() << QColor(img.pixel(0, 0));
qDebug() << QColor(img.pixel(1, 0));
qDebug() << QColor(img.pixel(0, 1));
qDebug() << QColor(img.pixel(1, 1));

PM MAIL   Вверх
maxi91m
Дата 23.4.2013, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(Amp @  23.4.2013,  21:08 Найти цитируемый пост)
У тебя loadFromData наверняка вернул 0, потому что он не принимает такие сырые данные.  

Точно, вернул  false

А в чем сырость данных заключается, передаю же в QByteArray  такой массив
Код

 uchar  buffer[16] = {255,123,123,123,255,123,123,123,255,123,123,123,255,123,123,123};//для примера


Ваш код вывел мне 
Код

QColor(ARGB 1, 1, 0, 0) 
QColor(ARGB 1, 1, 0, 0) 
QColor(ARGB 1, 0, 0.501961, 0) 
QColor(ARGB 1, 0, 0.501961, 0) 


но я не пойму если изображение  2x2 то в него попали  только  четыре нуль, а это значит что должно выводить четыре красных цвета, а вывело 2 красных и 2  других.

Как данные асcоцеируются из массива с QImage?
 я думал значение с пикселом, а тут как-то иначе.

Это сообщение отредактировал(а) maxi91m - 23.4.2013, 20:39
--------------------
PM MAIL ICQ   Вверх
Amp
Дата 23.4.2013, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Цитата(maxi91m @  23.4.2013,  20:23 Найти цитируемый пост)
А в чем сырость данных заключается, передаю же в QByteArray  такой массив

Данные должны быть в определенном графическом формате, например jpg, а не просто набор чисел. В документации же написано.
PM MAIL   Вверх
maxi91m
Дата 23.4.2013, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(Amp @  23.4.2013,  21:38 Найти цитируемый пост)
анные должны быть в определенном графическом формате, например jpg, а не просто набор чисел. В документации же написано. 


А чем тогда отличаются данные uchar? такие же числа лежат.

--------------------
PM MAIL ICQ   Вверх
Amp
Дата 23.4.2013, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Твои данные не являются ни jpg, ни png, ни tga, ни bmp, ни каким-либо другим форматом, который поддерживает Qt. Это просто raw bitmap data в формате, который только тебе и известен. loadFromData читает массив данных и если формат прямо не задан, то метод по первым байтам и известным сигнатурам пытается определить с чем имеет дело. Естественно ничего не выходит и он возвращает false. В документаци все подробно написано.
PM MAIL   Вверх
maxi91m
Дата 23.4.2013, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Цитата(Amp @  23.4.2013,  22:04 Найти цитируемый пост)
Твои данные не являются ни jpg, ни png, ни tga, ни bmp, ни каким-либо другим форматом, который поддерживает Qt. Это просто raw bitmap data в формате, который только тебе и известен. loadFromData читает массив данных и если формат прямо не задан, то метод по первым байтам и известным сигнатурам пытается определить с чем имеет дело. Естественно ничего не выходит и он возвращает false. В документаци все подробно написано. 

С этим разобрались, теперь надо понять, по какому принципу надо укладывать данные в массив  uchar? в вашем случае, когда создаешь таблицу цветов, просто если ее не создавать, каждый элемент массива это цвет пиксела в градациях серого(0-255).
А у вас не пойму по какому алгоритму идет присвоение цвета пикселу, и сколько чисел отвечают за один пиксел( по логике 2)?

После длительного изменения параметров прихожу к выводу что длина слова 4 байта, а значит каждый раз надо добивать каждую строку.
Так?


Это сообщение отредактировал(а) maxi91m - 23.4.2013, 22:20
--------------------
PM MAIL ICQ   Вверх
Jeka178RUS
Дата 24.4.2013, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 3.9.2012

Репутация: нет
Всего: нет



Если хочешь использовать QByteArray c QImage используй метод data() в качестве параметра конструктора.

Палитру можешь задать как указано тут http://stackoverflow.com/questions/1367809...-image-using-qt
PM MAIL   Вверх
maxi91m
  Дата 24.4.2013, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 191
Регистрация: 14.1.2007
Где: Нижний Новгород

Репутация: нет
Всего: нет



Код

    QImage img((uchar*)buffer, 5, 5, QImage::Format_Indexed8);
    img.setColorCount(255);
    for(int i = 0; i < 255; i++)
        img.setColor(i, qRgb(i,i,i));
    qDebug() << QColor(img.pixel(1, 1));


Вываливается 

Код

ASSERT failure in QVector<T>::at: "index out of range", file q:\qt5_workdir\w\s\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 348
Debug Error!

Program: C:\Qt\Qt5.0.2\5.0.2\msvc2012_64\bin\Qt5Cored.dll
Module: 5.0.2
File: global\qglobal.cpp
Line: 1985

ASSERT failure in QVector<T>::at: "index out of range", file q:\qt5_workdir\w\s\qtbase\include\qtcore\../../src/corelib/tools/qvector.h, line 348

(Press Retry to debug the application)


убираю qDebug() << QColor(img.pixel(1, 1)); то все собирается.
Что тут не так?

------------------------------------------
Вопрос снимается, там и правда лежали данные которые вне диапазона палитры


Это сообщение отредактировал(а) maxi91m - 24.4.2013, 21:37
--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1340 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.