Автор: Капитан Немо
e-mail: capnemo@xakep.ru
Февраль 2002 г.
Всем желаю доброго здравия.
Сегодня, мой маленький друг, я расскажу тебе о
Targa Image File (в простонародье TGA). Слишком долгим и бесполезным делом было бы перечислять
компании, которые время от времени перекупали
права на этот стандарт друг у друга. Для пользы
дела можно сказать, что формат этот создавался как
аппаратно-ориентированный. С этими файлами работали
адаптеры Targa, True Vista и другие. Формат позволяет
хранить изображения с глубиной цвета до 32 бит, и
при этом быстро читается и распаковывается. Однако,
хватит предисловий... Следуй за мной, мой осторожный
путник, и я покажу тебе, как глубока эта кроличья
нора...
Коротко обо всем.
Файл TGA начинается с заголовка, затем идет необязательное поле идентификации изображения,
необязательная цветовая таблица, растровые данные.
Но есть и формат TGA 2.0, который полностью повторяет
оригинальный формат, дополняя его рядом новых элементов.
Все они, кроме концовки, являются необязательными
и включаются в файл по желанию разработчика изображения.
Концовка необходима для того, чтобы отличить один
формат от другого. Вот эти элементы:
- Директория разработчика
- Область разработчика
- Область расширения
- Таблица цветовой коррекции
- Почтовая марка (уменьшенное изображение)
- Таблица строк развертки
- Концовка
Говорить о новой версии я не буду по известным только
мне соображениям, но если вдруг кому-либо будет
интересно, пишите - я отвечу.
Все имеет свое начало.
И TGA файл не исключение. Заголовок TGA таков:
IDLength: byte; {Размер поля ID-изображения}
ColorMapType: byte; {Тип цветовой палитры}
ImageType: byte; {Код типа изображения}
CMapStart: word; {Начало палитры}
CMapLength: word; {Длинна палитры}
CMapDepth: byte; {Глубина элементов палитры}
XOffset: word; {Смещение по горизонтали}
YOffset: word; {Смещение по вертикале}
Width: word; {Ширина}
Height: word; {Высота}
PixelDepth: byte; {Размер пикселя}
ImageDesc: byte; {Дескриптор изображения}
IDLength - указывает размер поля идентификации изображения, которое идет сразу за заголовком.
Наиболее догадливые уже поняли, что если это поле
имеет значение 0, то области идентификации изображения
в файле нет. Если оно есть, то содержит информацию,
понятную человеку (текст), либо понятную только
той программе, которая создала этот файл.
ColorMapType - определяет наличие цветовой таблицы.
Если это поле равно 1 - таблица есть, 0 -нет, если
лежит в пределах от 2 до 255 - таблица есть, но формат ее понятен только программе, создавшей файл.
ImageType - тип изображения. Их вроде всего семь.
Значение | Тип данных изображения | Цвет таблицы | Кодировка |
0 | В файле нет данных изображения | Нет | Нет |
1 | Изображение с таблицей | Есть | Нет |
2 | TrueColorImage | Нет | Нет |
3 | Монохромное | Нет | Нет |
9 | Изображение с таблицей | Есть | Есть |
10 | TrueColorImage | Нет | Есть |
11 | Монохромное | Нет | Есть |
CMapStart - Смещение первого элемента в таблице цветов.
Таблица может быть больше чем палитра. %)
CMapLength - Количество элементов цветовой таблицы.
CMapDepth - Количество битов в элементе таблицы.
Дальше идут несколько полей, которые пояснять, как мне
кажется, нет большой необходимости. Кто не понял, смотрите
предыдущие статьи. Следует сказать только одно - максимальный
размер TGA изображения 512х482. Звучит смешно и ни кем не поддерживается.
ImageDesc - описатель изображения. Несет в себе следующую
информацию:
7-6 биты - резерв, всегда 0.
4-5 биты - определяют позицию начала изображения. Если
оба бита равны 0, то изображение начинается в левом нижнем
углу.
0-3 биты - количество битов атрибутов в пикселе.
(альфа-канал,оверлейные биты и биты прерывания). Это связанно
с работой адаптеров Targa и ничего конкретного по поводу этих
значений я сказать не могу.
Без заглавия.
Я не буду писать о том, как читать данные изображения,
как их выводить и т.д. Я не буду укомплектовывать эту статью программой, демонстрирующей чтение файла TGA.
Я хочу остановиться на кодировании данных изображения.
В TGA используется пиксельно-ориентированный RLE алгоритм
сжатия. Допустим, у нас изображение 256 цветов (для тех,
кто в танке, 8 бит на пиксель). И имеется последовательность
из пяти одинаковых пикселей:
234|234|234|234|234|
В файле TGA такая последовательность запишется как:
5|234
При этом важно помнить, что счетчик группы должен иметь
единицу в старшем бите, т.е. вместо 5 в примере следует поставить 128+5=133. Пять там стоит для наглядности.
Что же делать с неповторяющимися пикселями? Объединим все неповторяющиеся пиксели в группу и назовем ее литералом. Литерал кодируется так:
исходная строка - 234|45|122|46
код - 4|234|45|122|46
При этом старший бит счетчика равен 0, что указывает на литеральную группу. Для закрепления, приведу большой
пример:
23|34|56|11|11|11|23|74|245|234|234|234|236 - исходный текст
3|23|34|56|131|11|3|23|74|245|131|234|1|236 - код
The end - как говорят у них...
Отвечу на любые вопросы в гостевой или мылом. Удачи всем.
Да прибудет с вами сила.
Написать мнение в гостевой книге.
:НАЗАД:
© 2001-2002 [F.E.G.]