一、TGA文件格式简介
TGA(Truevision Graphics Adapter)文件格式,通常又称为Targa(Truevision Advanced Raster Graphics Adapter),是由Truevision公司1984年创建,并被用于该公司的首个视频图像产品中。1989年,Truevision公司制定了TGA文件格式的扩展格式,使得开发者可以依据其标准开发跨平台跨产品的兼容格式。TGA文件格式可用于存储8位、15位、16位、24位、32位图像数据,支持alpha通道、颜色索引、RGB颜色、灰度图、行程压缩算法(RLE)、开发者自定义区、缩略图等。TGA文件格式因其格式简单、易于实现、没有专利费用和跨平台等特性而被图形图像工业广泛使用。TGA格式支持压缩,使用不失真的压缩算法。
二、TGA文件结构
TGA原始文件结构(v1.0)由以下两个部分组成:文件头和图像/颜色表数据。TGA扩展文件结构(v2.0)由五部分组成:文件头、图像/颜色表数据、开发者自定义区域、扩展区域和文件尾。其中V2.0版本的文件头和图像/颜色表数据与V1.0保持一致。
1. 文件头(Tga File Header)
由图像描述信息字段长度、颜色表类型、图像类型、颜色表说明和图像说明五个字段组成,总计18字节,描述了图像存储的基本信息,应用程序可依据该部分字段值读写图像数据。
从下列TgaHeader结构体可以清楚了解文件头的结构。
typedef struct _TgaHeader{
BYTE IDLength; /* 00h Size of Image ID field */
BYTE ColorMapType; /* 01h Color map type */
BYTE ImageType; /* 02h Image type code */
WORD CMapStart; /* 03h Color map origin */
WORD CMapLength; /* 05h Color map length */
BYTE CMapDepth; /* 07h Depth of color map entries */
WORD XOffset; /* 08h X origin of image */
WORD YOffset; /* 0Ah Y origin of image */
WORD Width; /* 0Ch Width of image */
WORD Height; /* 0Eh Height of image */
BYTE PixelDepth; /* 10h Image pixel size */
BYTE ImageDescriptor; /* 11h Image descriptor byte */
} TGAHEAD;
2. 图像/颜色表数据(Image/Color Map Data)
由图像描述信息(可选)、颜色表数据和图像数据三部分组成,用于存储图片的图像信息。
3.开发者自定义区域(Developer Area)
包含开发者定义字段列表和开发者字典(用于存储开发者定义字段的值),该区域为开发者扩展该文件格式提供接口,以便存储额外的信息。
4. 扩展区域(Extension Area)
由扩展区域大小、作者姓名、作者注释、日期/时间、工作名称/ID、工作累计耗时、编辑软件的名称、编辑软件的版本、关键颜色、像素宽高比、灰度值、颜色校正表偏移量、缩略图偏移量、扫描线表偏移量、alpha通道类型、扫描线表、缩略图图像数据和颜色校正表组成,为Truevision公司定义的标准扩展功能,以提供更多的图像附加信息。
5. 文件尾(TGA File Footer)
由扩展区域偏移量、开发者目录偏移量和TGA文件扩展格式签名三部分组成,用于验证TGA文件扩展格式,并可以确定扩展区域和开发者字典的位置。
三、图像数据说明
1.颜色存储
对于颜色的存储,TGA规定按整型数据存储,颜色值各分量在整型数据中的存储顺序从高到低为(A)RGB。以16位带alpha通道的颜色数据为例,可用2位无符号整型数据存储,内存中二进制表示为:arrrrrgg gggbbbbb,文件中二进制表示为:gggbbbbb arrrrrgg。
2.图像模式
①未压缩的颜色表图像:这种类型的格式用于存储基于颜色表的图像(像素值用颜色索引表示),文件头中的颜色表类型(Field2)项的值必须为1,图像类型(Field3)必须为1。
②未压缩的真彩色图像:这种类型的格式用于存储用(A)RGB值表示的像素数据,文件头中的颜色表类型(Field2)项的值必须为0,图像类型(Field3)必须为2。
③未压缩的黑白图像:这种类型的格式用于存储灰度值表示的像素数据,文件头中的颜色表类型(Field2)项的值必须为0,图像类型(Field3)必须为3。
④RLE压缩的颜色表图像:这种类型的格式用于存储基于颜色表的图像(像素值用颜色索引表示),存储数据时采用RLE压缩算法,文件头中的颜色表类型(Field2)项的值必须为1,图像类型(Field3)必须为9。
⑤RLE压缩的真彩色图像:这种类型的格式用于存储用(A)RGB值表示的像素数据,存储数据时采用RLE压缩算法,文件头中的颜色表类型(Field2)项的值必须为0,图像类型(Field3)必须为10。
⑥RLE压缩的黑白图像:这种类型的格式用于存储灰度值表示的像素数据,存储数据时采用RLE压缩算法,文件头中的颜色表类型(Field2)项的值必须为0,图像类型(Field3)必须为11。
3.行程压缩算法RLE
行程压缩算法RLE(Run-length encoded)是一种简单的无损资料压缩法,其好处是压缩和解压缩都非常快。RLE算法的基本思路是把数据按照线性序列分成两种情况:一种是连续的重复数据块,另一种是连续的不重复数据块,对其分别打包压缩。TGA格式中使用的RLE数据包定义如下:
四、TGA文件实例分析
准备工作:用格式工厂将下图转为tga格式后,用Visual Studio2022以二进制编辑器形式打开。
1. 文件头(Tga File Header)
各字节依次表示:
①无图像信息字段,1字节,00
②没有使用颜色表,1字节,00
③未压缩的真彩图像,1字节,02
④由于不含颜色表,表示颜色表规范的第4-8字节都为0
⑤x轴起始坐标为0,2字节,00;y轴起始坐标为0,2字节,00;
即从图像左下角原点开始
⑥图像宽度为180,2字节,B4;图像高度也为180,2字节,B4。
⑦图像每像素存储占用位数为24位,2字节,18
注:TGA文件格式中字段的字节存储次序采用Little-Endian的方式,即小端在前。这里每一部分的二进制存储是按低字节在前高字节在后。
2. 文件尾(TGA File Footer)**
各字节依次表示:
①无扩展区域,4字节,全为0
②无开发者自定义区域,4字节,全为0
③逐字节对应ASCII码的字符串为TRUEVISION-XFILE,则说明该TGA文件为v2.0的TGA扩展格式文件,16字节
④结束字符,对应ASCII码的“.”,1字节,2E
⑤文件结束符,1字节,00
3. 验证文件大小
文件显示为97,244字节,且图片尺寸为180×180。
通过分析二进制数据,可以计算得到文件大小:
18(文件头)+180×180×3(图像部分)+0+0(无扩展区域和开发在自定义区域+26(文件尾)=97244字节,符合文件显示。
五、总结
TGA文件格式的文件头和文件尾是固定的,媒体通过相应字段信息,可以实现对文件的交换、管理、编辑和呈现。
TGA文件格式通过在文件头规定图像和颜色表的基本信息,应用程序可依据字段值读写图像数据,实现媒体对文件的管理和编辑。
通过文字头的颜色表首地址可轻松获取用于呈现的图像数据,如实例图像为无颜色表的RGB图像,因为没有颜色表,所以偏移18个字节即可获取用于呈现的图像数据。
另外,文件尾规定了扩展区域和开发者定义区域的长度并提示文件的结束,便于媒体获取信息。