浏览量:1,196

TGA文件格式解析

本文主要介绍TGA文件格式的解析,在网上找到了一篇Truevision提供的TGA文件解析的文档,这里对它的部分内容进行翻译,具体代码实现的下载网址(见下载),在该下载页面上也提供了英文原文件,代码测试通过了参考【3】中提供的所有TGA图像文件。

一.   介绍

2013-11-21-tgafile

图1 TGA 文件格式

如图1所示,新的TGA文件包含5个区域:(1)TGA文件头(TGA File Header);(2)图像/颜色表数据(Image/Color Map Data);(3)开发者区域(Developer Area);(4)拓展区域(Extension Area);(5)TGA文件注脚(TGA File Footer)。最后3个区域是在1980年9月以前增加的,所以1989年9月以前的TGA文件格式称为旧生版本TGA文件格式,1989年9月以后的则称为新版本的TGA文件格式。接下来介绍TGA文件格式中涉及的几种类型的颜色。

伪彩色(pseudo-color)图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色。用这种方式产生的色彩本身是真的,不过它不一定反映原图的色彩。在VGA显示系统中,调色板就相当于色彩查找表,从16色标准VGA调色板的定义可以看出这种伪彩色的工作方式。伪彩色图像是每个像素的颜色不是由每个基色分量的数值直接决定,而是把像素值当作彩色查找表的表项入口地址,去查找一个显示图像时使用的R,G,B强度值,用查找出的R,G,B强度值产生的彩色称为伪色彩。

真彩色(true-color)是指图像中的每个像素值都分成R、G、B三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为真彩色。例如图像深度为24,用R:G:B=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为2^8=256种。图像可容纳2^24=16M种色彩。这样得到的色彩可以反映原图的真实色彩,故称真彩色。例如,用RGB 5:5:5表示的彩色图像,R,G,B分量大小的值直接确定三个基色的强度,这样得到的彩色是真实的原图彩色。

调配色(direct-color)的获取是通过每个像素点的R、G、B分量分别作为单独的索引值进行变换,经相应的色彩变换表找出各自的基色强度,用变换后的R、G、B强度值产生的色彩。

调配色与伪彩色相比,相同之处是都采用查找表,不同之处是前者对R、G、B分量分别进行查找变换,后者是把整个像素当作查找的索引进行查找变换。因此,调配色的效果一般比伪彩色好。

调配色与真彩色比,相同之处是都采用R、G、B分量来决定基色强度,不同之处是前者的基色强度是由R、G、B经变换后得到的,而后者是直接用R、G、B决定。在VGA显示系统中,用调配色可以得到相当逼真的彩色图像,虽然其色彩数受调色板的限制而只有256色。

二.   文件结构分析

2.1     TGA文件头(TGA FILE HEADER

图像信息字段长度(ID length字段11个字节):

这个字段规定了包含在字段6(Image ID字段)中的字节数,最大的字符数是255,它的值为0,则表示在这个文件中没有图像信息字段。

颜色表类型(Color Map Type字段21个字节):

当前已定义的有两个值0或者1,0 表示没有颜色表(color map),1 表示颜色表存在。前面的128个颜色表类型码由Truevision保留使用,而后面的128个颜色表类型码(128-255)能用于开发者的应用中。真彩图正常情况下不会使用颜色表字段,但是当前的一些应用存储调色板信息或者开发者定义的信息在这个字段中,所以最好确认下字段3(图像类型,Image Type),确保你的文件是否使用到颜色表字段中的数据,否则忽略那些信息。在保存或者创建真彩图像文件时并不会使用到这个字段,请将它设置为0以确保兼容性。参考Developer Area中对存储开发者定义信息的规约。

图像类型(Image Type字段31个字节):

TGA文件格式可以用于存储各种位深度的伪彩色,真彩色,调配色,目前定义的7种文件格式如下所示:

2013-11-21 17-16-29

表1. 图像类型

颜色表规约(Color Map Specification字段 45字节):

这个字段和它的子字段描述图像中使用的颜色表,如果颜色表类型字段为0,则表示不存在颜色表,则5个字节应该被设置为0,这些字节需要写入文件中。

字段4.12字节)颜色表首地址(First Entry Index):

第一个颜色表表项的索引,是装载颜色表的首地址。例如:一个颜色表共有1024个表项,但是只需要使用72个表项,这个字段可以允许从颜色表的中间开始索引,例如位置342。

字段4.22字节)颜色表长度(Color map Length:

                   颜色表表项的数量

字段4.31个字节)颜色表表项大小(Color map Entry Size:

                   每个表项占用的位数,典型的值有15,16,24,或者32位。

图像规约(Image Specification字段 510个字节):

这个字段和它的子字段描述了图像的屏幕位置,尺寸和像素深度。

字段5.12个字节) - 图像X位置的起始位置(X-origin of Image:

                    图像左下角的水平坐标

字段5.22个字节) -图像Y位置的起始位置(Y-origin of Image:

                    图像左下角的垂直坐标

字段5.32个字节) -图像宽度(Image Width

字段5.42个字节) -图像高度(Image Height

字段5.51个字节) -像素深度(Pixel Depth

                     这个字段表示每个像素占用的位数,通常的值是8,16,24,32位。

字段5.61个字节) -图像描述符(Image Descriptor

2013-11-21 17-16-51

表2. 图像描述符

0-3位,规定了每个像素属性位的数量。看field 24(属性类型,Attributes Type)以获取更多信息

4-5位,这些位用于表示像素数据从文件发送到屏幕的顺序,位4表示从左到右,位5表示从上到下,如下图所示。

2013-11-21 17-17-04

表3. 图像原点

6-7位,必需为0。

2.2     图像/颜色表数据(Image/Color Map Data

图像信息字段(Image ID字段 6(可变长):

存储了图像的身份信息(Identifying Information)这个字段最长为255个字节,Field 1字段规定了它的长度。

颜色表数据(Color Map Data字段7(可变长):

这个变长字段包含了颜色表信息(LUT数据),字段4.3和字段4.2共同规定了字段7的长度。每个颜色表表项用整数个字节存储,规定每个颜色表的RGB采用连续的位存储,每个颜色的位长为MIN(Field 4.3/3,8)。例如:字段4.3是24,则每个颜色规约是8位;如果是32,则颜色规约仍是8位,未使用的位规定为属性位,属性位通常称为Alpha通道,重叠位(overlay bit),中断位(Interrupt Bits)。

图像数据(Image Data字段 8(可变长):

这个字段包含Width*Height个像素,每个像素的格式如下所示:(1)用伪彩色表示,则是一个颜色图的一个索引号;(2)真彩图,则是属性,红绿,蓝顺序的数据;(3)用调配色表示,就是独立的颜色表索引。

2.3     开发者区域(DEVELOPER AREA

开发者数据(Developer Data字段 9(可变长):

开发者字段的尺寸和格式完全是由开发者规定的,读取包含这些信息的文件时,完全可以忽略它们,除非理解这些内容。文件可能包含多个开发者字段,所以需要创建开发者目录(Developer Directory),它是开发者区域中这些字段的映射表。开发者目录可以使用偏移量来表示,存储在TGA文件注角(File Footer)4-7字节内,该偏移量是从文件的起始位置算起至开发者目录的起始位置,如果偏移量为0,则不存在开发者字段。

2013-11-21 17-17-15

图2. 开发者目录

目录中的第一个short值,规定了在目录中标签的数量,余下的是一组TAG,OFFSET,和SIZE的组合,每个TAG是一个分布在0至65535之间的值,0-32767的值用于开发者使用,32668-65535之间的值被Truevision保留,Truevision维护一个标签列表,分配给一些公司。该字段不详细介绍,具体参见文档。

2.4     拓展区域(EXTENSION AREA

该拓展区域用于满足一些开发者对额外信息的需求,该区域的位置也是通过保存在TGA文件注脚中的偏移量来确定的,如果该偏移量为0,则不存在拓展区域。该区域包括拓展区域尺寸,作者名字,作者评论等信息,这里也不详细解释,具体参见相应文档。

2.5     TGA文件注脚(TGA FILE FOOTER

最后26个字节表示文件注脚,但是对于原先版本的TGA文件格式不存在这个区域,可以扫描8-23字节,如果符合下列字符串:

TRUEVISION-XFILE

说明很有可能存在注脚字段,否则则属于原先版本的TGA文件。该区域的格式如下所示:

Bytes 0-3:拓展区域偏移量

Bytes 4-7:开发者区域偏移量

Bytes 8-23:签名

Byte 24:ASCII码”.”

Byte 25:二进制数0x00。

三.   总结

3.1 行程编码(Run-length Code)

行程编码利用到许多图片有很多像素的值相同的特点,对于大区域像素相同值的图片的行程编码可以有效的减小存储图像的大小。行程编码(RLE)图像包含两种类型的数据元素:行程包(Run-length Packet)和原始包(Raw Packet)。每个包的第1个字段称为重复计数字段(Repetition Count Field),第2个字段称为像素值字段(Pixel Value Field),行程包的像素值字段包含一个简单的像素值,而原始包的像素值字段包含一个可变长的像素值。重复计数字段的最高位(即位7)表明该包的类型,如果值为1,则是行程包,如果值为0,则为原始包。重复计数字段低7位规定了包中的像数值的数目,如果是行程包,它表明有像素值字段规定的像素值的连续像素数;如果是原始包,它规定了接下来的字段包含的像素数。如果值为0,则实际有1个像素,如果值为0x7F,则有128个像素。

行程包从不跨行编码像素,即使是一个扫描行的结尾和下一行的开始包含相同的像素值。这里举个例子说明上述两种包的区别,考虑有一行数据,128个3字节大小的像素,像素值都一样。用原始包表示,则需要3*128+1=385个字节;用行程包表示,则仅需要1+3=4个字节。

2013-11-21 17-18-35

表4. 行程包

2013-11-21 17-18-49

表5. 原始包

3.2 文件格式总结

2013-11-21-tga-format

图3. TGA文件格式

3.3 六种图像类型

数据类型1:颜色映射图

字段 2:Color-Map Type(1 Byte)必须为0x01

字段3:Image Type 必须为0x01

数据类型2:真彩图

字段2:Color-Map Type(1 Byte)必须为0x00

字段3:Image Type 必须为0x02

数据类型3:黑白图(未映射)

字段2:Color-Map Type(1 Byte)必须为0x00

字段3:Image Type 必须为0x03

数据类型4:行程编码(RLE),颜色映射图

字段2:Color-Map Type(1 Byte)必须为0x01

字段3:Image Type 必须为0x09

数据类型5:行程编码(RLE),真彩图

字段2:Color-Map Type(1 Byte)必须为0x00

字段3:Image Type 必须为0x0A

数据类型6:行程编码(RLE),黑白图

字段2:Color-Map Type(1 Byte)必须为0x00

字段3:Image Type 必须为0x0B

3.4 关于TGA中调配色的使用情况

可以参考链接【3】中的讨论

四.   参考

【1】http://baike.baidu.com/link?url=hi9yW-Uv7866_Viaf5GfTlU535MdAw3b0WSlYILmm6CtJFIl_XoHUW-kx0XTxyuA

【2】http://www.fileformat.info/format/tga/sample/

【3】http://www.gamedev.net/topic/387001-how-to-tell-if-a-targa-is-direct-color/

 

下载地址

spacer

Leave a reply