| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QImage + массивы сырых данных |
| Автор: maxi91m 23.4.2013, 17:03 |
| Помогите разобраться в Qimage Есть трехмерный массив данных(данные могут быть целого не отрицательного типа) Массив создан динамически, данные считаны из бинарного файла. Необходимо добиться максимально быстрого отображения полученного данных в градациях серого. Объясните как лучше передавать данные в QImage. Данные в массиве в виде одного числа, как мне уложить это число в QByteArray? Если QImage, как я понял хранит данные в виде пикселов(три компоненты), то мне надо размножить мое число(положим, что в массиве числа от 0-255) Например есть число типа int 123 в массиве, тогда в массив QByteArray мне необходимо записать три подряд одинаковых числа, чтобы задать значение одного пиксела, ТАК? int QByteArray 123 (123 123 123) а так как QByteArray содержит char то мне необходимо сделать преобразование типа из int в char Так все на самом деле, или нет? Если устанавливать по писелам, то будет тормознуто? Какой лучше виджет использовать для отображения QImage, если потом поверх полученного изображения необходимо вывести еще графические данные(что то вроде линии, которая показывает место среза в других плоскостях), через которые можно будет управлять данными выводимыми на других виджетах? |
| Автор: Jeka178RUS 23.4.2013, 17:24 |
| Используй http://qt-project.org/doc/qt-4.8/qimage.html#QImage-4 с форматом QImage::Format_Indexed8 А теперь внимание вопрос: почему исходный массив трехмерный? |
| Автор: maxi91m 23.4.2013, 17:50 | ||||||
массив трехмерный, потому что данные в файле это значения снятые на МРТ, в трехмерном пространстве. Каждый срез массива представляет какую то картинку, и ее надо вывести в градациях серого. Пишу
получаю
что я делаю не так? Так получилось
Но вопрос остается, что я делаю не так с QByteArray |
| Автор: Amp 23.4.2013, 19:31 |
| Format_Indexed8 подразумевает наличие палитры. |
| Автор: maxi91m 23.4.2013, 19:43 | ||
Если передавать uchar buffer[16] то все нормально(без установки палитры) пикселы закрашиваются, но не работает
а с QByteArray не получается и просто вывести пикселы не получается. |
| Автор: Amp 23.4.2013, 20:08 | ||
| У тебя loadFromData наверняка вернул 0, потому что он не принимает такие сырые данные. Добавлено через 13 минут и 57 секунд Как-то так. Причем надо учесть, что в исходном массиве данные должны быть выровнены на границу слова.
|
| Автор: Amp 23.4.2013, 20:38 | ||
Данные должны быть в определенном графическом формате, например jpg, а не просто набор чисел. В документации же написано. |
| Автор: maxi91m 23.4.2013, 20:42 | ||
А чем тогда отличаются данные uchar? такие же числа лежат. |
| Автор: Amp 23.4.2013, 21:04 |
| Твои данные не являются ни jpg, ни png, ни tga, ни bmp, ни каким-либо другим форматом, который поддерживает Qt. Это просто raw bitmap data в формате, который только тебе и известен. loadFromData читает массив данных и если формат прямо не задан, то метод по первым байтам и известным сигнатурам пытается определить с чем имеет дело. Естественно ничего не выходит и он возвращает false. В документаци все подробно написано. |
| Автор: maxi91m 23.4.2013, 21:11 | ||
С этим разобрались, теперь надо понять, по какому принципу надо укладывать данные в массив uchar? в вашем случае, когда создаешь таблицу цветов, просто если ее не создавать, каждый элемент массива это цвет пиксела в градациях серого(0-255). А у вас не пойму по какому алгоритму идет присвоение цвета пикселу, и сколько чисел отвечают за один пиксел( по логике 2)? После длительного изменения параметров прихожу к выводу что длина слова 4 байта, а значит каждый раз надо добивать каждую строку. Так? |
| Автор: Jeka178RUS 24.4.2013, 10:30 |
| Если хочешь использовать QByteArray c QImage используй метод data() в качестве параметра конструктора. Палитру можешь задать как указано тут http://stackoverflow.com/questions/13678093/display-grayscale-image-using-qt |
| Автор: maxi91m 24.4.2013, 20:00 | ||||
Вываливается
убираю qDebug() << QColor(img.pixel(1, 1)); то все собирается. Что тут не так? ------------------------------------------ Вопрос снимается, там и правда лежали данные которые вне диапазона палитры |