STСI (Sir-Tech's Crazy Image) формат.

 

 

Формат STСI используется для хранения графических объектов в игре Jagged Alliance 2. Каждый STСI файл может содержать одно или несколько изображений. Изображения кодируются с помощью 16-битного (16bppRGB565) или 8-битного (8bppIndexed) алгоритмов. 16-битные файлы содержат всегда только одно изображение, большая часть их находится в папке LOADSCREENS.

 

 

Заголовок (64 байта, структура STCIHeader).

 

Структура STCIHeader описана в Standard Gaming Platform\imgfmt.h.

 

1-4 байты – буквы “STCI” идентификатор формата.

5-8 байты – исходный размер изображений в байтах. Для файлов содержащих несколько изображений здесь хранится бессмысленное большое число.

9-12 байты – размер изображений в байтах после сжатия.

13-16 байты – номер прозрачного цвета в палитре, всегда равно 0. Имеет смысл только для 8-битных файлов.

17-20 байты – флаги.

1 бит – всегда равен 0, назначение неясно (STCI_TRANSPARENT).

2 бит – всегда равен 0, назначение неясно (STCI_ALPHA).

3 бит – 1 если файл 16-битный (STCI_RGB).

4 бит – 1 если файл 8-битный (STCI_INDEXED).

5 бит – 1 если алгоритм сжатия ZLIB (STCI_ZLIB_COMPRESSED).

6 бит – 1 если алгоритм сжатия ETRLE (STCI_ETRLE_COMPRESSED).

7-32 биты – всегда равны 0, не используются.

Повидимому, флаги всегда равны 4, 40 или 41.

4 – для 16-битных файлов.

40 – для 8-битных неанимированных файлов.

41 – для 8-битных анимированных файлов.

21-22 байты – высота изображения в пикселях. Имеет смысл только для 16-битных файлов.

23-24 байты – ширина изображения в пикселях. Имеет смысл только для 16-битных файлов.

 

Значение следующих 20 байт разнится в зависимости от алгоритма кодирования.

 

 

25-44 байты для 16-битных файлов:

 

25-28 байты – маска красного цвета. Повидимому, всегда равна 63488

(00000000 00000000 11111000 00000000) .

29-32 байты – маска зелёного цвета. Повидимому, всегда равна 2016

(00000000 00000000 00000111 11100000) .

33-36 байты – маска синего цвета. Повидимому, всегда равна 31

(00000000 00000000 00000000 00011111) .

37-40 байты – маска альфа канала. Повидимому, всегда равна 0.

41 байт – глубина красного цвета. Повидимому, всегда равна 5.

42 байт – глубина зелёного цвета. Повидимому, всегда равна 6.

43 байт – глубина синего цвета. Повидимому, всегда равна 5.

44 байт – глубина альфа канала. Повидимому, всегда равна 0.

Значения масок и глубин цветов соответствует алгоритму кодирования 16bppRGB565.

 

 

25-44 байты для 8-битных файлов:

 

25-28 байты – число цветов в палитре, повидимому всегда равно 256.

29-30 байты – число изображений в файле.

31 байт – глубина красного цвета. Повидимому, всегда равна 8.

32 байт – глубина зелёного цвета. Повидимому, всегда равна 8.

33 байт – глубина синего цвета. Повидимому, всегда равна 8.

34-44 байты – не используются.

Алгоритм кодирования 8-битных файлов – 8bppIndexed c 24-битной палитрой на 256 цветов.

 

45 байт – глубина цвета. Число бит на пиксель. Равен 8 для 8-битных файлов, и 16 для 16-битных.

46-49 байты – размер данных приложения (Application Data) в байтах. Не равно нулю только для анимированных файлов. Повидимому, всегда равно колличеству изображений умноженное на 16.

49-64 байты – не используются.

 

Повидимому, существует тип STCI файлов, в которых 46-48 байты не используются размер данных приложения при этом сдвигается на три байта. Возможно это зависит от локализации. В .NET StiEditore используется именно такой порядок байт.

 

 

Изображения.

 

В 16-битных файлах после заголовка и до конца файла идут данные изображения закодированые в формате 16bppRGB565.

 

В 8-битных файлах после заголовка файла идут 256 * 3 = 768 байт палитры.

После палитры идут заголовки изображений, которые занимают (кол-во изображений) * 16 байт.

 

 

Заголовок изображения(16 байт, структура STCISubImage).

 

Структура STCISubImage описана в Standard Gaming Platform\imgfmt.h.

 

1-4 байты – сдвиг в байтах от начала данных изображений до начала данных данного изображения. Для первого изображения равен 0. Для второго – размер первого и т. д.

5-8 байты – размер данных изображения в байтах.

9-10 байты – смещение изображения по горизонтали в пикселях.

11-12 байты – смещение изображения по вертикали в пикселях.

13-14 байты – высота изображения в пикселях.

15-16 байты – ширина изображения в пикселях.

 

После заголовков изображений идут данные изображений. Каждый байт соответствует порядковому номеру цвета пикселя в палитре. Данные изображений сжаты алгоритмом сжатия ETRLE, о котором ниже. Алгоритмом сжатия ZLIB, повидимому, не использется.

Неанимированные 8-битные файлы на этом заканчиваются

 

У анимированных файлов есть ещё данные приложения (Application Data). Размер – (кол-во изображений) * 16. Содержание следующее:

 

Для изображений являющихся началом нового ракурса (направления)

1-8 байты – равны нулю, назначение не ясно.

9 байт – равен числу изображений в данном ракурсе.

10 байт – равен 2, назначение не ясно.

11-16 байты – равны нулю, назначение не ясно.

 

Для изображений неявляющихся началом нового ракурса (направления)

1-16 байты – равны нулю, назначение не ясно.

 

 

Алгоритм сжатия ETRLE.

 

Расшифровка аббривиатуры ETRLE не известна. Последние три буквы вероятно означают Run-Length Encoding.

 

Сжимаемая последовательность разбивается на подпоследовательности нулевых и ненулевых байт.

Каждая последовательность нулевых байт заменяется на один байт, старший бит которого равен 1. А значение равно 128 плюс число нулей в подпоследовательности.

Перед каждой последовательностью ненулевых байт ставится служебный байт, старший бит которого равен 0. А значение равно числу байт в подпоследовательности.

Если длина нулевой подпоследовательности более 127, то для её кодирования аналогичным образом используется несколько байт, тоже самое можно сказать и о ненулевых последовательностях.

В конце каждой строки ставится нулевой байт (признак конца строки).


Page Information

  • 4 months ago [history]
  • View page source
  • You're not logged in
  • No tags yet learn more

Wiki Information

Recent PBwiki Blog Posts