Programming and Animation
Programming and animation ideas, articles, tutors, scripts, plugins in the 3d-
TGA. image file format
Дата: Февраль 12th, 2009 Neill Комментариев нетФормат хранения растровых изображений. Представлен в нескольких вариантах, среди которых самый простой – хранения битовой маски без сжатия, и чуть более сложных – использование алгоритма сжатия 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. теперь остается только прочитанное сохранить на диск в определенный растровый формат файла.
Программирование Delphi, OpenGL, TGA



Свежие комментарии