Конференция "Media" » Как преобразовать 8-битеый цвет в 4-байтный TColor? [D7, WinXP]
 
  • andreil © (24.04.08 12:57) [0]
    на входе - байт, представляющий собой цвет в системе RGB (по два байта на цвет + 2 свободно(наверное)).
    Вопрос: как собственно преобразовать такой цвет в нормальный TColor?
    Пробовал преобразовывать байт в строку бинарного вида, а затем из битов составлял HEX-строку, представляющую собой строковое отображение цвета TColor. Проблема в том, что данная методика не помогает, цвета искажаются :(
  • Восхищенный (24.04.08 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 © (24.04.08 13:12) [2]
    Насколько я помню там первый байт - прозрачность, а все остальный и есть ,байты RGB.
  • andreil © (24.04.08 13:24) [3]

    > Смещения проверь сам, мне влом.

    Красный - норм, а вот зеленый и синий не в порядке. А так - преобразует, но тоже с нарушением цвета :(
  • Восхищенный (24.04.08 13:30) [4]
    > tesseract ©   (24.04.08 13:12) [2]
    Там всего один байт. См. сабж.

    > andreil ©   (24.04.08 13:24) [3]
    Значит, вот это неверно: по два бита на цвет + 2 свободно (или ты что-то другое имел в виду?)
  • Юрий Иванов (24.04.08 13:39) [5]
    В [1] похоже все правильно, кроме того, что цвета надо масштабировать. В двухбитном цвете только 4 градации. В восьмибитном цвете надо чтобы из $3 получился $FF, а из $0 - $00
  • andreil © (24.04.08 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, которую и пытаюсь прочитать :)

    Получается более-менее читаемая картинка, но все-равно, не то, тк нарушены цвета (хоть и не так сильно).
  • МистерТ (24.04.08 15:00) [7]
    Не знаю как в Q1, но чаще всего 8-битные картинки имеют совершенно другой формат:
    Имеется палитра (таблица цветов) вида
    индекс : цвет в формате RGB (или ARGB, или RGBA)
    обычно содержится в заголовке файла или отдельным файлом если несколько имеют одинаковую палитру.
    А далее массив из 8-битных индексов по которым в палитре и находится конкретный цвет.
  • han_malign © (24.04.08 15:06) [8]

    > тк нарушены цвета

    > Смещения проверь сам, мне влом.

    а правильнее всего, и по скорости, и по гибкости
    const palette6bit = array[0..63] of TColor = (0, ...);
  • andreil © (24.04.08 20:07) [9]

    > Не знаю как в Q1, но чаще всего 8-битные картинки имеют
    > совершенно другой формат:

    Я вообщето уже третий день мучаюсь, такчто проблему изучить успел ;)
    Мной было замечено, что в текстурах Ку1 кроме основной текстуры хранятся еще и мипмапы.
    А цвет там идет так, как я говорил, те без палитры, это просто необходимо преобразовать в БМП, тк ОпенГл не понимает (вроде как) голый массив пикселей.
  • МистерТ (25.04.08 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 © (25.04.08 18:42) [11]

    > МистерТ  

    Спасибо за помощь! А то уже до рендера дошел, а вот с текстурами голяк :)
  • andreil (26.04.08 13:18) [12]

    > МистерТ

    Сами по себе эти исходники неполны, но таблицу преобразований вместе с ее загрузкой я выкопал. Текстуры грузятся на ОК, но местами вс-таки имеются нарушения цветопередачи, но это - недостатки таблицы, придется исправлять вручную :(
    А так - тема закрыта.
 
Конференция "Media" » Как преобразовать 8-битеый цвет в 4-байтный TColor? [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]