Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.pas
 d_8to24table: array[0..256 - 1] of Cardinal; - массив из 256 элементов для перевода 8-битных значений в 24-битные.
2) в файле gl_draw.pas
procedure 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
2-1289391013
Gu
2010-11-10 15:10
2011.01.30
HEX-редактор файлов


15-1287159733
VirEx(home)
2010-10-15 20:22
2011.01.30
чат mailslot домен нагрузка


8-1203255568
AL2002_
2008-02-17 16:39
2011.01.30
Выковырять инфу из wav-ки


8-1209027451
andreil
2008-04-24 12:57
2011.01.30
Как преобразовать 8-битеый цвет в 4-байтный TColor?


11-1228663529
exero
2008-12-07 18:25
2011.01.30
Потоки и двухядерные процы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский