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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QImage from 8-bit Raw data  (Прочитано 15751 раз)
OKTA
Гость
« : Апрель 30, 2014, 16:40 »

Товарищи, подскажите, как лучше всего впихнуть в QImage картинку из сырых 8-битных данных (всмысле без заголовка какого-либо)?
Идея создавать QImage c форматом Indexed8 и затем задавать colortable на все возможные 8-битные цвета показалось мне какой-то диковатой  Обеспокоенный
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Апрель 30, 2014, 17:10 »

Товарищи, подскажите, как лучше всего впихнуть в QImage картинку из сырых 8-битных данных (всмысле без заголовка какого-либо)?
Идея создавать QImage c форматом Indexed8 и затем задавать colortable на все возможные 8-битные цвета показалось мне какой-то диковатой  Обеспокоенный
Что вы подразумеваете под 8-битными данными? Если это палитровай режим, где индекс цвета задается байтом, то палитра понадобится все равно. Если она не идет с данными, то вам придется самому ее формировать. Как минимум нужно будет задать цвета, индексы которых есть в данных.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #2 : Апрель 30, 2014, 17:18 »

Идея создавать QImage c форматом Indexed8 и затем задавать colortable на все возможные 8-битные цвета показалось мне какой-то диковатой  Обеспокоенный
И в чем же её дикость? Вообще не представляю как можно это сделать по-другому.
Код
C++ (Qt)
QImage gray((const uchar *)bits.data(), width, bits.length() / width, QImage::Format_Indexed8);
QVector<QRgb> palette;
for (int i = 0; i < 255; ++i) palette.append(qGray(i, i, i);
gray.setColorTable(palette);
gray.save(file.fileName() + ".jpg");
« Последнее редактирование: Апрель 30, 2014, 17:20 от xokc » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 30, 2014, 17:25 »

Часто проще сразу прописать в true color, т.е. создать Format_ARGB32 и заполнить. Ничего что RGB одинаковые, сидеть с Indexed8 неудобно.

ТС любит загадки, вот хорошая: имедж хранит 4 байта на точку, но значения по R, G, B - флоты. Как он устроен?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Апрель 30, 2014, 18:13 »

Вообще не представляю как можно это сделать по-другому.

255 тоже должно быть включено в палитру:
Код
C++ (Qt)
for (int i = 0; i < 255; ++i) palette.append(qGray(i, i, i);
 
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Май 01, 2014, 17:51 »

255 тоже должно быть включено в палитру:
Согласен, в общем случае, несомненно - да. Мой случай был несколько "кастрированным", у меня в исходных данных не было цвета с индексом 255. Но здесь, конечно, нужно цикл крутить до 255 включительно.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Май 01, 2014, 18:03 »

Согласен, в общем случае, несомненно - да. Мой случай был несколько "кастрированным", у меня в исходных данных не было цвета с индексом 255. Но здесь, конечно, нужно цикл крутить до 255 включительно.
Или сделать наоборот, пробежаться по данным и заполнить в палитре только те цвета, индексы которых присутствуют. Может там все изображение состоит из каких нибудь пяти цветов.
Записан
OKTA
Гость
« Ответ #7 : Май 05, 2014, 09:55 »

Да, именно индексы содержатся.  Не могу понять, почему QImage не поддерживает формат Indexed8  Непонимающий Это сделано ради экономии места или чего? Хотел как раз избавить себя от создания таблицы цветов вручную, потому и спросил о других вариантах решения, если они вообще существуют.
как понимаю, с помощью этого создается таблица для "grayscale"
Код:
for (int i = 0; i < 255; ++i) palette.append(qGray(i, i, i);
А если не grayscale, то как надо создавать таблицу цветов?  Шокированный Хотя видимо выдернуть сначала все используемые индексы и по ним составлять таблицу будет куда удобнее на первый взгляд.

По загадке подумаю)
« Последнее редактирование: Май 05, 2014, 10:12 от OKTA » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 05, 2014, 10:42 »

А если не grayscale, то как надо создавать таблицу цветов?  Шокированный

Напр пользователь выбирает какие-то определенные цвета (из UI) и ими рисует. В результате имедж может быть записан 1 байт на точку (и даже меньше). Т.е. единственный резон - экономия памяти (что не компенсирует хлопот). Поэтому палитра уже лет 20 (если не больше) "дань истории".
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #9 : Май 06, 2014, 10:17 »

Не могу понять, почему QImage не поддерживает формат Indexed8  Непонимающий
Видимо у нас какие-то разные представления о формате Indexed8. В этом формате предполагается, что:
1. изображение содержит не более 256 цветов
2. все значения элементов данных в изображении есть не цвет как таковой, а индекс в массиве цветов (палитре)
3. соответственно системе для рисования этого изображения нужно получить от пользователя не только элементы данных, но и палитру. Без неё непонятно что именно рисовать.
Все эти требования QImage поддерживает в полном объеме.
Хотя видимо выдернуть сначала все используемые индексы и по ним составлять таблицу будет куда удобнее на первый взгляд.
Я правильно понимаю, что Вы предполагаете, что существует некая стандартная системная предопределенная палитра из 256 цветов, типа VGA 256?
Это заблуждение. Никто, кроме пользователя не сможет сможет сказать какой именно цвет должен соответствовать каждому их значений индекса. Именно поэтому формирование палитры возлагается на пользователя.
А если не grayscale, то как надо создавать таблицу цветов?  Шокированный
Можно так for (int i = 0; i < 256; ++i) palette.append(0) - если хотите всегда черный "квадрат" видеть, можно так palette.append(qRgb(0, 0, i)) - если bluescale нужен. Кроме Вас этого всё равно никто знать не может.
« Последнее редактирование: Май 06, 2014, 10:27 от xokc » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Май 06, 2014, 11:44 »

Я правильно понимаю, что Вы предполагаете, что существует некая стандартная системная предопределенная палитра из 256 цветов, типа VGA 256?
Это заблуждение. Никто, кроме пользователя не сможет сможет сказать какой именно цвет должен соответствовать каждому их значений индекса. Именно поэтому формирование палитры возлагается на пользователя.
Существуют, есть даже форматы файлов для хранения палитр. Можно наблюдать напр в старых редакторах ресурсов на Mac. Но, повторюсь, интерес к палитре давно угас.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Май 06, 2014, 11:55 »

Существуют, есть даже форматы файлов для хранения палитр.
xokc пишет про другое.
Записан
OKTA
Гость
« Ответ #12 : Май 06, 2014, 12:23 »

Да, с этим всем я согласен. Но что делать, если я получаю изображение без таблицы цветов? Должна же быть какая-то стандартная схема? Или же qRgb(i,i,i) в цикле как раз эту стандартную схему и дает?
Я может что-то путаю конечно и ошибка где-то у меня, но ситуация следующая.
Я получаю 8-битное изображение без палитры цветов. Работаю с ним через QImage, задавая размеры изображения, количеств байт в строке и формат Indexed8. После этого, независимо от того, задам я таблицу цветов или не задам, я получаю видимое изображение, хоть и цвета могут быть искаженными (при чем чаще всего случайно искажены). И в итоге не могу понять, какую подсунуть таблицу цветов, чтобы получить нормальное ожидаемое изображение без искажений  В замешательстве А может 8-битное изображение не использовать палитру или если 8-битное, то обязательно используется палитра?
Записан
OKTA
Гость
« Ответ #13 : Май 06, 2014, 12:24 »

Цитировать
ТС любит загадки, вот хорошая: имедж хранит 4 байта на точку, но значения по R, G, B - флоты. Как он устроен?  Улыбающийся
Igors, а что имелось ввиду под словом "флот"?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Май 06, 2014, 12:28 »

И в итоге не могу понять, какую подсунуть таблицу цветов, чтобы получить нормальное ожидаемое изображение без искажений  В замешательстве
Попробуйте задать палитру как показал xokc в третьем сообщении.

Igors, а что имелось ввиду под словом "флот"?
float
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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