Форум: "Media";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
ВнизКак преобразовать 8-битеый цвет в 4-байтный TColor? Найти похожие ветки
← →
andreil © (2008-04-24 12:57) [0]на входе - байт, представляющий собой цвет в системе RGB (по два байта на цвет + 2 свободно(наверное)).
Вопрос: как собственно преобразовать такой цвет в нормальный TColor?
Пробовал преобразовывать байт в строку бинарного вида, а затем из битов составлял HEX-строку, представляющую собой строковое отображение цвета TColor. Проблема в том, что данная методика не помогает, цвета искажаются :(
← →
Восхищенный (2008-04-24 13:10) [1]Если все так, как ты сказал (в чем есть сомнения), то:
R := ColorByte and 3;
G := ColorByte and (3 shl 2);
B := ColorByte and (3 shl 4);
Color := (B shl 16) or (G shl 8) or R;
Смещения проверь сам, мне влом.
← →
tesseract © (2008-04-24 13:12) [2]Насколько я помню там первый байт - прозрачность, а все остальный и есть ,байты RGB.
← →
andreil © (2008-04-24 13:24) [3]
> Смещения проверь сам, мне влом.
Красный - норм, а вот зеленый и синий не в порядке. А так - преобразует, но тоже с нарушением цвета :(
← →
Восхищенный (2008-04-24 13:30) [4]> tesseract © (24.04.08 13:12) [2]
Там всего один байт. См. сабж.
> andreil © (24.04.08 13:24) [3]
Значит, вот это неверно: по два бита на цвет + 2 свободно (или ты что-то другое имел в виду?)
← →
Юрий Иванов (2008-04-24 13:39) [5]В [1] похоже все правильно, кроме того, что цвета надо масштабировать. В двухбитном цвете только 4 градации. В восьмибитном цвете надо чтобы из $3 получился $FF, а из $0 - $00
← →
andreil © (2008-04-24 13:57) [6]Сделал так:
for i:=tmp.miptex_t.width-1 downto 0 do
for n:=tmp.miptex_t.height-1 downto 0 do
begin
R := tmp.buf[i+n*tmp.miptex_t.Width] and 3;
G := tmp.buf[i+n*tmp.miptex_t.Width] and (3 shl 2);
B := tmp.buf[i+n*tmp.miptex_t.Width] and (3 shl 4);
r:=r*$55;
g:=g*$55;
b:=b*$55;
Color := (B shl 16) or (G shl 8) or R;
tmp.Mip1.Pixels[i,n]:=color;
end;
Итог можете найти по ссылке: http://www.rapidshare.ru/656679
lava1.bmp - то, что должно быть (полученно стонней программой Wally)
lava1.mip1.bmp - то, что получилось с приведенным выше алгоритмом
lava1.mip - текстура в вормате Ку1, которую и пытаюсь прочитать :)
Получается более-менее читаемая картинка, но все-равно, не то, тк нарушены цвета (хоть и не так сильно).
← →
МистерТ (2008-04-24 15:00) [7]Не знаю как в Q1, но чаще всего 8-битные картинки имеют совершенно другой формат:
Имеется палитра (таблица цветов) вида
индекс : цвет в формате RGB (или ARGB, или RGBA)
обычно содержится в заголовке файла или отдельным файлом если несколько имеют одинаковую палитру.
А далее массив из 8-битных индексов по которым в палитре и находится конкретный цвет.
← →
han_malign © (2008-04-24 15:06) [8]
> тк нарушены цвета
> Смещения проверь сам, мне влом.
а правильнее всего, и по скорости, и по гибкости
const palette6bit = array[0..63] of TColor = (0, ...);
← →
andreil © (2008-04-24 20:07) [9]
> Не знаю как в Q1, но чаще всего 8-битные картинки имеют
> совершенно другой формат:
Я вообщето уже третий день мучаюсь, такчто проблему изучить успел ;)
Мной было замечено, что в текстурах Ку1 кроме основной текстуры хранятся еще и мипмапы.
А цвет там идет так, как я говорил, те без палитры, это просто необходимо преобразовать в БМП, тк ОпенГл не понимает (вроде как) голый массив пикселей.
← →
МистерТ (2008-04-25 09:26) [10]Ты уверен, что цвет идет без палитры ?
Что мешает использовать палитру основного изображения для мип-уровней ?
> Я вообщето уже третий день мучаюсь, такчто проблему изучить
> успел ;)
Что-то долго...
За 10 минут гуглом были найдены исходники всех трех квак (можно было и сразу на сайт ID зайти, но это не спортивно) и конверсия второй кваки на делфи.
Смотрю исходники и вижу:
1) в файле gl_image.pasd_8to24table: array[0..256 - 1] of Cardinal;
- массив из 256 элементов для перевода 8-битных значений в 24-битные.
2) в файле gl_draw.pasprocedure Draw_Fill(x, y, w, h, c: Integer);
type
Tcolor = record
case boolean of
true: (c: Cardinal);
false: (v: array[0..3] of Byte);
end;
var
color: Tcolor;
begin
if (Cardinal(c) > 255) then
ri.Sys_Error(ERR_FATAL, "Draw_Fill: bad color");
qglDisable(GL_TEXTURE_2D);
color.c := d_8to24table[c];
...
3) в том же файлеqglTexImage2D( GL_TEXTURE_2D,
0,
GL_COLOR_INDEX8_EXT,
256, 256,
0,
GL_COLOR_INDEX,
GL_UNSIGNED_BYTE,
image8 );
и что-то мне смутно подсказывает, что этот самый GL_COLOR_INDEX8_EXT - это 8-битная индексация.
Если что - http://sourceforge.net/project/showfiles.php?group_id=55303
конверсия Q2 на делфи, если не находил - посмотри как там реализована загрузка мип-уровней.
← →
andreil © (2008-04-25 18:42) [11]
> МистерТ
Спасибо за помощь! А то уже до рендера дошел, а вот с текстурами голяк :)
← →
andreil (2008-04-26 13:18) [12]
> МистерТ
Сами по себе эти исходники неполны, но таблицу преобразований вместе с ее загрузкой я выкопал. Текстуры грузятся на ОК, но местами вс-таки имеются нарушения цветопередачи, но это - недостатки таблицы, придется исправлять вручную :(
А так - тема закрыта.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2011.01.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c