目录
一、TGA文件格式概述
TGA(Truevision Graphics Adapter)文件格式,通常又称为Targa(Truevision Advanced Raster Graphics Adapter),是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga,该格式支持压缩,使用不失真的压缩算法,可以带通道图,另外还支持行程编码压缩。
二、色彩类型介绍
1.伪色彩
伪彩色(pseudo-color)图像的每个像素值实际上是一个索引值或代码,该代码值作为色彩查找表CLUT(Color Look-Up Table)中某一项的入口地址,根据该地址可查找出包含实际R、G、B的强度值。这种用查找映射的方法产生的色彩称为伪彩色。用这种方式产生的色彩本身是真的,不过它不一定反映原图的色彩。在VGA显示系统中,调色板就相当于色彩查找表,从16色标准VGA调色板的定义可以看出这种伪彩色的工作方式。伪彩色图像是每个像素的颜色不是由每个基色分量的数值直接决定,而是把像素值当作彩色查找表的表项入口地址,去查找一个显示图像时使用的R,G,B强度值,用查找出的R,G,B强度值产生的彩色称为伪色彩。
2.真色彩
真彩色(true-color)是指图像中的每个像素值都分成R、G、B三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为真彩色。例如图像深度为24,用R:G:B=8:8:8来表示色彩,则R、G、B各占用8位来表示各自基色分量的强度,每个基色分量的强度等级为28=256种。图像可容纳224=16M种色彩。这样得到的色彩可以反映原图的真实色彩,故称真彩色。例如,用RGB 5:5:5表示的彩色图像,R,G,B分量大小的值直接确定三个基色的强度,这样得到的彩色是真实的原图彩色。
3.调配色
调配色(direct-color)的获取是通过每个像素点的R、G、B分量分别作为单独的索引值进行变换,经相应的色彩变换表找出各自的基色强度,用变换后的R、G、B强度值产生的色彩。
调配色与伪彩色相比,相同之处是都采用查找表,不同之处是前者对R、G、B分量分别进行查找变换,后者是把整个像素当作查找的索引进行查找变换。因此,调配色的效果一般比伪彩色好。
调配色与真彩色比,相同之处是都采用R、G、B分量来决定基色强度,不同之处是前者的基色强度是由R、G、B经变换后得到的,而后者是直接用R、G、B决定。在VGA显示系统中,用调配色可以得到相当逼真的彩色图像,虽然其色彩数受调色板的限制而只有256色
三、文件结构分析
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文件格式。
1.TGA文件头(TGA FILE HEADER)
(1)图像信息字段长度(ID length)
字段1(1个字节)
这个字段规定了包含在字段6(Image ID字段)中的字节数,最大的字符数是255,它的值为0,则表示在这个文件中没有图像信息字段。
(2)颜色表类型(Color Map Type)
字段2(1个字节)
当前已定义的有两个值0或者1,0 表示没有颜色表(color map),1 表示颜色表存在。前面的128个颜色表类型码由Truevision保留使用,而后面的128个颜色表类型码(128-255)能用于开发者的应用中。真彩图正常情况下不会使用颜色表字段,但是当前的一些应用存储调色板信息或者开发者定义的信息在这个字段中,所以最好确认下字段3(图像类型,Image Type),确保你的文件是否使用到颜色表字段中的数据,否则忽略那些信息。在保存或者创建真彩图像文件时并不会使用到这个字段,请将它设置为0以确保兼容性。
(3)图像类型(Image Type)
字段3(1个字节)
TGA文件格式可以用于存储各种位深度的伪彩色,真彩色,调配色,目前定义的7种文件格式如下所示:
(4)颜色表规约(Color Map Specification)
字段 4(5字节)
这个字段和它的子字段描述图像中使用的颜色表,如果颜色表类型字段为0,则表示不存在颜色表,则5个字节应该被设置为0,这些字节需要写入文件中。
字段4.1(2字节)颜色表首地址(First Entry Index):
第一个颜色表表项的索引,是装载颜色表的首地址。例如:一个颜色表共有1024个表项,但是只需要使用72个表项,这个字段可以允许从颜色表的中间开始索引,例如位置342。
字段4.2(2字节)颜色表长度(Color map Length):
颜色表表项的数量
字段4.3(1个字节)颜色表表项大小(Color map Entry Size):
每个表项占用的位数,典型的值有15,16,24,或者32位。
(5)图像规约(Image Specification)
字段 5(10个字节)
这个字段和它的子字段描述了图像的屏幕位置,尺寸和像素深度。
字段5.1(2个字节) – 图像X位置的起始位置(X-origin of Image):
图像左下角的水平坐标
字段5.2(2个字节) –图像Y位置的起始位置(Y-origin of Image):
图像左下角的垂直坐标
字段5.3(2个字节) –图像宽度(Image Width)
字段5.4(2个字节) –图像高度(Image Height)
字段5.5(1个字节) –像素深度(Pixel Depth)
这个字段表示每个像素占用的位数,通常的值是8,16,24,32位。
关于像素深度的理解可参照此blog
字段5.6(1个字节) –图像描述符(Image Descriptor)
0-3位,规定了每个像素属性位的数量。
4-5位,这些位用于表示像素数据从文件发送到屏幕的顺序,位4表示从左到右,位5表示从上到下,如下图所示。
6-7位,必需为0。
2.图像/颜色表数据(Image/Color Map Data)
(1)图像信息字段(Image ID)
字段 6(可变长)
存储了图像的身份信息(Identifying Information)这个字段最长为255个字节,1.(1)字段规定了它的长度。
(2)颜色表数据(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)。
(3)图像数据(Image Data)
字段 8(可变长)
这个字段包含Width*Height个像素,每个像素的格式如下所示:
(1)用伪彩色表示,则是一个颜色图的一个索引号;
(2)真彩图,则是属性,红绿,蓝顺序的数据;
(3)用调配色表示,就是独立的颜色表索引。
3.开发者区域(DEVELOPER AREA)
字段 9(可变长)
开发者字段的尺寸和格式完全是由开发者规定的,读取包含这些信息的文件时,完全可以忽略它们,除非理解这些内容。文件可能包含多个开发者字段,所以需要创建开发者目录(Developer Directory),它是开发者区域中这些字段的映射表。开发者目录可以使用偏移量来表示,存储在TGA文件注角(File Footer)4-7字节内,该偏移量是从文件的起始位置算起至开发者目录的起始位置,如果偏移量为0,则不存在开发者字段。
4.拓展区域(EXTENSION AREA)
该拓展区域用于满足一些开发者对额外信息的需求,该区域的位置也是通过保存在TGA文件注脚中的偏移量来确定的,如果该偏移量为0,则不存在拓展区域。该区域包括拓展区域尺寸,作者名字,作者评论等信息。
5.TGA文件注脚(TGA FILE FOOTER)
Bytes 0-3:拓展区域偏移量
Bytes 4-7:开发者区域偏移量
Bytes 8-23:签名
Byte 24:ASCII码”.”
Byte 25:二进制数0x00。
6.汇总表
四、实例演示
1.图片
2.数据解析
(1)图像信息字段长度
对应00 说明没有图像信息字段
(2)颜色表类型
对应00 没有颜色表
(3)图像类型码
总为2
(4)颜色表
颜色表类型为00 颜色表值全为0。
(5)图像规约
图像 X 坐标起始位置:00
图像 Y 坐标起始位置:00
图像宽度:128
图像高度:128
图像像素深度:16
每个像素属性位的数量:1
原点在左下角
(6)图像信息字段
图像信息字段长度为0,故此段没有数据
(7)颜色表数据
颜色表类型为 0,故此段没有数据
(8)图像数据
对于16位色彩
在图像中以BGRBGRBGR…顺序排列
观察图像,基本是由三种颜色构成,在四周均是透明色,中心是由不同程度的黑色和红色构成。
在四周,数据均为“FF7F”。此图像是PNG图像转化得来,关于TGA格式中透明像素的存放格式目前没有查到资料。(查到后回来更新)
“0000”显然就是纯黑色,在黑色周围应该均为红色。任选一组bgr“0875”验证。
将其转化为二进制后,可得:
B:00001
G:000011
R:10101
蓝色和绿色分量数值极小,红色分量数值较大,可知此像素为红色。
(9)注脚
00为注脚byte25 0x00。
2E为注脚byte21 ascii码“.”。
byte8-23转化之后为字符“TRUEVISION-XFILE”也表明了此图片为tga格式。
byte0-6均为0,表示无开发者区域及拓展区域。