Формат хранения растровых изображений. Представлен в нескольких вариантах, среди которых самый простой – хранения битовой маски без сжатия, и чуть более сложных – использование алгоритма сжатия LZW.

Самый простой вариант TGA

Данный вариант формата бывает очень уместен, когда требуется сохранить, например, скриншот экрана. Нам достаточно в этом случае считать с нарисованного очередного кадра битовый массив определенного размера и его же сохранить в файл, при этом только составив заголовок TGA в начало файла для возможности дальнейшего чтения в любом подручном растровом редакторе. Согласитесь, что такой подход манит своей простотой.

Далее код будет представлен на Delphi (Object Pascal).

TGA без сжатия

 

Заголовок следующий

TTGAHEADER = packed record

tfType : Byte;

tfColorMapType : Byte;

tfImageType : Byte;

tfColorMapSpec : Array[0..4] of Byte;

tfOrigX : Array [0..1] of Byte;

tfOrigY : Array [0..1] of Byte;

tfWidth : Array [0..1] of Byte;

tfHeight : Array [0..1] of Byte;

tfBpp : Byte;

tfImageDes : Byte;

end;

 

Запись содержимого tga файла следующая:

1. обнуляем все параметры заголовка (первоначально)

ZeroMemory(@tgaHeader, SizeOf(tgaHeader));

2. заполняем по нашему усмотрению некоторые поля в информацией о растре

// Fill the structure with info for the image to be saved

tgaHeader.tfImageType := TGA_RGB;

tgaHeader.tfWidth[0] := Width mod 256;

tgaHeader.tfWidth[1] := Width div 256;

tgaHeader.tfHeight[0] := Height mod 256;

tgaHeader.tfHeight[1] := Height div 256;

tgaHeader.tfBpp := 32;

где TGA_RGB равно 2.

3. записываем заголовок

// Write the header to disk

bytesWritten := fileStream.Write( tgaHeader, sizeof(tgaHeader) );

if bytesWritten <> SizeOf(tgaHeader) then begin

Result := False;

Exit;

end;

4. меняем местами два цветовых канала (красный и синий)

// Switch the red and blue channels (from RGB to BGR)

SwapRB();

5. рассчитываем длину битового массива (включая альфа канал)

// Calculate number of bytes in image

length := Width*Height*4;

6. записываем битовый массив после заголовка

// Save the image contents to file

bytesWritten := fileStream.Write( rgbBits^, length );

if bytesWritten <> length then begin

Result := False;

Exit;

end;

Такова последовательность записи самого простого случая для tga формата.

 

Берем скриншот

Теперь пару слов о скриншотах ОГЛ экрана.

1. Получаем массив с текущими параметрами видового окна

glGetIntegerv(GL_VIEWPORT, @viewport);

2. устанавливаем информацию для растрового изображения

Width := viewport[2];

Height := viewport[3];

ColorDepth := 32;

3. Выделяем память под битовый массив в соответствии с размером окна (включая альфа канал)

GetMem(rgbBits, Width*Height*4);

4. Требуем завершить все команды рисования ОГЛ

glFinish();

5. устанавливаем режим выравнивания пикселей

glPixelStorei(GL_PACK_ALIGNMENT, 4);

glPixelStorei(GL_PACK_ROW_LENGTH, 0);

glPixelStorei(GL_PACK_SKIP_ROWS, 0);

glPixelStorei(GL_PACK_SKIP_PIXELS, 0);

6. читаем содержимое буфера кадра в битовый массив (включая альфа канал)

glReadPixels(0, 16, viewport[2], viewport[3], GL_RGBA, GL_UNSIGNED_BYTE, rgbBits);

7. теперь остается только прочитанное сохранить на диск в определенный растровый формат файла.

TGA. image file format
Метки:        

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *