TGA格式编码问题详解

本文档是为满足许多对 TGA 图像格式的了解需要而创建的。本文摘录自truevision 技术指南的附录 C,如果
需要更进一步的信息,请致信以下地址:

           at&t
           electronic photography and imaging center
           2002 wellesley ave.
           indianapolis, in 42619
本文档不求全面,但力求准确。如果你发现了任何拼写错误或内容错误,请告诉我,( david mcduffe, 
75530,2626 ),我将改正这些错误,谢谢。
不全面的原因是 TGA 包含了超过六种图像文件格式,而其中的几种较为常用。 我选择了我现在使用的格式并
在本文中加以详解。 如果你需要本文中没有包含的格式说明,你可以与你的 truevision 代理商联系。
对所有的 TGA 格式的文件而言,其第三字节(二进制整数)用来区别各种不同的 TGA 文件。下面列出了该字
节表明的对应文件类型:
	0  -  文件中没有图像数据
	1  -  未压缩的,颜色表图像
	2  -  未压缩的,rgb 图像
	3  -  未压缩的,黑白图像
	9  -  runlength 编码的颜色表图像
	10 -  runlength 编码的 rgb 图像
	11 -  压缩的,黑白图像
	32 -  使用 huffman,delta 和 runlength 编码的颜色表图像
	33 -  使用 huffman,delta 和 runlength 编码的颜色映射图像,4 趟四叉树类型处理。
	本文仅仅描述对应 1,2,9 和 10 的文件格式。
--------------------------------------------------------------------------------
|数据类型 1: 颜色表(color-mapped)图像
|--------|--------|------------------------------------------------------------
|  偏移  |  长度  |                            描述
|--------|--------|------------------------------------------------------------
|    0   |     1  |  图像信息字段(见本子表的后面)的字符数		       
|        |        |                                                            
|        |        |  本字段是 1 字节无符号整型,指出了图像格式区别字段长度     
|        |        |  其取值范围是 0 到 255 ,当它为 0 时表示没有图像的     
|        |        |  信息字段。					               
|        |        |  						               
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表的类型	                                       
|        |        |                                                            
|        |        |  该字段为表示对应格式 1 的图像而包含一个二进制 1           
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    2   |     1  |  图像类型码 	                                       
|        |        |                                                            
|        |        |  该字段总为 1 , 这也是此类型为格式 1 的原因               
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规格		                               
|        |        | 					                       
|    3   |     2  |  颜色表首址                                                
|        |        |  颜色表首元表项的整型(低位-高位)索引 		       
|        |        |                                                            
|    5   |     2  |  颜色表的长度                                          
|        |        |  颜色表的表项总数,整型(低位-高位)	               
|        |        |                                                            
|    7   |     1  |  颜色表表项的位(bit)数                                   
|        |        |  16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA 
|        |        |  							       
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    8   |    10  |  图像规格		                                       
|        |        |                                                            
|    8   |     2  |  图像 x 坐标起始位置                                       
|        |        |  图像左下角 x 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   10   |     2  |  图像 y 坐标起始位置                                       
|        |        |  图像左下角 y 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   12   |     2  |  图像宽度	                                               
|        |        |  以像素为单位,图像宽度的整型(低位-高位)值	       
|        |        |                                                            
|   14   |     2  |  图像高度	                                               
|        |        |  以像素为单位,图像高度的整型(低位-高位)值               
|        |        |                                                            
|   16   |     1  |  图像每像素存储占用位(bit)数                             
|        |        |  					                       
|        |        |                                                            
|   17   |     1  |  图像描述符字节	                                       
|        |        |  bits 3-0 - 每像素的属性位(bit)数			       
|        |        |             	                                       
|        |        |  bit 4    - 保留,必须为 0		                       
|        |        |  bit 5    - 屏幕起始位置标志	                       
|        |        |             0 = 原点在左下角        		       
|        |        |             1 = 原点在左上角          		       
|        |        |             truevision 图像必须为 0              	       
|        |        |  bits 7-6 - 交叉数据存储标志		               
|        |        |             00 = 无交叉	                               
|        |        |             01 = 两路奇/偶交叉 		               
|        |        |             10 = 四路交叉		                       
|        |        |             11 = 保留	                               
|        |        |  这一项应该设为 0,不要问我为什么			       
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|   18   |  可变  |  图像信息字段		                               
|        |        |  包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的   
|        |        |  值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以    
|        |        |  含有 255 个字符。如果需要存储更多信息,可以放在图像数据   
|        |        |  之后						       
|        |        | 							       
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数据                                                
|        |        |                                                            
|        |        |  起始位置由前一个字段的大小决定;其长度由单项数据大小      
|        |        |  和数据项数目决定(在前面相应的说明字段中给出)            
|        |        |  每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit) 
|        |        |  被认为是属性位。					       
|        |        |                                                            
|        |        |  4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN,
|        |        |  		    字节 3 表示 RED,字节 4 表示属性	       
|        |        |  3 字节表项中各字节依次对应 BLUE,GREEN,RED               
|        |        |                                                            
|        |        |  2 字节表项中,两个字节分解成如下形式:		       
|        |        |  arrrrrgg gggbbbbb					       
|        |        |  但是,由于低位在前,高位在后的存储顺序,从文件中读出表项  
|        |        |  时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。  
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  图像数据字段					       
|        |        |                                                            
|        |        |  该字段给出了 (高度)x(宽度)个颜色表项索引,每个索引    
|        |        |  以整数个字节的形式存储(典型的例子如 1 或 2 个字节)      
|        |        |  所有的数据都没有符号,对于 2-字节表项而言,低位字节是     
|        |        |  先存储的。						       
|        |        |                                                            
-------------------------------------------------------------------------------


--------------------------------------------------------------------------------
|数据类型 2: 无颜色表 rgb 图像	                              
|--------|--------|------------------------------------------------------------
|   偏移 |   长度 |                         描述                              
|--------|--------|----------------------------------------------------------
|    0   |     1  |  图像信息字段( 见本子表的后面 )的字符数
|        |        |                                          
|        |        |  本字段是 1 字节无符号整型,指出了图像格式区别字段长度
|        |        |  其取值范围是 0 到 255 ,当它为 0 时表示没有图像的
|        |        |  信息字段。
|        |        |
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表类型
|        |        |                                                 
|        |        |  该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示
|        |        |  颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。
|        |        |  提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射
|        |        |        中的第一种颜色
|        |        | 
|--------|--------|------------------------------------------------------------
|    2   |     1  |  图像类型码
|        |        |                                                     
|        |        |  该字段总为 2 , 这也是此类型为格式 2 的原因	
|        |        |  
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规格
|        |        |                                                         
|        |        |  如果颜色表类型字段为 0 则被忽略;否则描述如下
|        |        |  
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型(低位-高位)索引
|        |        |                  
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项总数,整型(低位-高位)     
|        |        |                                   
|    7   |     1  |  颜色表表项的位(bit)数
|        |        |  16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA
|        |        |  
|        |        |                                                           
|--------|--------|------------------------------------------------------------
|    8   |    10  |  图像规格
|        |        |                             
|    8   |     2  |  图像 x 坐标起始位置       
|        |        |  图像左下角 x 坐标的整型(低位-高位)值
|        |        |  
|        |        |
|   10   |     2  |  图像 y 坐标起始位置
|        |        |  图像左下角 y 坐标的整型(低位-高位)值
|        |        |  
|        |        |
|   12   |     2  |  图像宽度 
|        |        |  以像素为单位,图像宽度的整型(低位-高位)值
|        |        | 
|   14   |     2  |  图像高度
|        |        |  以像素为单位,图像高度的整型(低位-高位)值
|        |        |
|   16   |     1  |  图像每像素存储占用位(bit)数
|        |        |  它的值为16,24 或 32 等等决定了该图像是 TGA 16,TGA24
|        |        |  TGA 32 等等
|        |        |
|   17   |     1  |  图像描述符字节
|        |        |  bits 3-0 - 每像素对应的属性位的位数;对于 	TGA 16,
|        |        |             该值为 0 或 1,对于 TGA 24,该值为 0,
|        |        |             对于 TGA 32,该值为 8
|        |        |             
|        |        |  bit 4    - 保留,必须为 0
|        |        |  bit 5    - 屏幕起始位置标志
|        |        |             0 = 原点在左下角
|        |        |             1 = 原点在左上角
|        |        |             对于 truevision 图像必须为 0
|        |        |  bits 7-6 - 交叉数据存储标志
|        |        |             00 = 无交叉	                               
|        |        |             01 = 两路奇/偶交叉 		               
|        |        |             10 = 四路交叉		                       
|        |        |             11 = 保留
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  图像信息字段		                               
|        |        |  包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的   
|        |        |  值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以    
|        |        |  含有 255 个字符。如果需要存储更多信息,可以放在图像数据   
|        |        |  之后						       
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数据                                                
|        |        |                                                
|        |        |  如果颜色表类型为 0,则该域不存在,否则越过该域直接读取
|        |        |  图像颜色表规格中描述了每项的字节数,为 2,3,4 之一
|        |        |  
|        |        |  
|        |        |  
|        |        |  
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  图像数据域
|        |        |                                                    
|        |        |  这里存储了(宽度)x(高度)个像素,每个像素中的 rgb 色值
|        |        |  该色值包含整数个字节
|        |        |  
|        |        |                                                           
|        |        |  3 字节表项中各字节依次对应 BLUE,GREEN,RED               
|        |        |                                                            
|        |        |  2 字节表项中,两个字节分解成如下形式:		       
|        |        |  arrrrrgg gggbbbbb					       
|        |        |  但是,由于低位在前,高位在后的存储顺序,从文件中读出表项  
|        |        |  时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位
|        |        |                                                          
|        |        |  4 字节表项包含了分别代表 blue,green,red 及属性的四个
|        |        |  字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象
|        |        |  TGA 32 类型的图像那样存储
|        |        |  
|        |        |                                                         
--------------------------------------------------------------------------------



--------------------------------------------------------------------------------
|数据类型 9:  runlength 编码,带颜色表的图像
|--------|--------|------------------------------------------------------------
|  偏移  |  长度  |                            描述
|--------|--------|------------------------------------------------------------
|    0   |     1  |  图像信息字段(见本子表的后面)的字符数		       
|        |        |                                                            
|        |        |  本字段是 1 字节无符号整型,指出了图像格式区别字段长度     
|        |        |  其取值范围是 0 到 255 ,当它为 0 时表示没有图像的     
|        |        |  信息字段。	
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    1   |     1  |  颜色表的类型	                                       
|        |        |                                                            
|        |        |  该字段为表示对应带颜色表的图像而总为 1 
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    2   |     1  |  图像类型码
|        |        |                                                            
|        |        |  本类型该字段为二进制 9
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规格
|        |        |                                                         
|        |        |  如果颜色表类型字段为 0 则被忽略;否则描述如下
|        |        |  
|        |        |  
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型(低位-高位)索引
|        |        |                  
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项总数,整型(低位-高位)     
|        |        |                                   
|    7   |     1  |  颜色表表项的位(bit)数
|        |        |  16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA
|        |        |                                                           
|--------|--------|------------------------------------------------------------
|    8   |    10  |  图像规格		                                       
|        |        |                                                            
|    8   |     2  |  图像 x 坐标起始位置                                       
|        |        |  图像左下角 x 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   10   |     2  |  图像 y 坐标起始位置                                       
|        |        |  图像左下角 y 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   12   |     2  |  图像宽度	                                               
|        |        |  以像素为单位,图像宽度的整型(低位-高位)值	       
|        |        |                                                            
|   14   |     2  |  图像高度	                                               
|        |        |  以像素为单位,图像高度的整型(低位-高位)值               
|        |        |                                                            
|   16   |     1  |  图像每像素存储占用位(bit)数                             
|        |        |  					                       
|        |        |                                                            
|   17   |     1  |  图像描述符字节	                                       
|        |        |  bits 3-0 - 每像素的属性位(bit)数			       
|        |        |             	                                       
|        |        |  bit 4    - 保留,必须为 0		                       
|        |        |  bit 5    - 屏幕起始位置标志	                       
|        |        |             0 = 原点在左下角        		       
|        |        |             1 = 原点在左上角          		       
|        |        |             truevision 图像必须为 0              	       
|        |        |  bits 7-6 - 交叉数据存储标志		               
|        |        |             00 = 无交叉	                               
|        |        |             01 = 两路奇/偶交叉 		               
|        |        |             10 = 四路交叉		                       
|        |        |             11 = 保留
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  图像信息字段		                               
|        |        |  包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的   
|        |        |  值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以    
|        |        |  含有 255 个字符。如果需要存储更多信息,可以放在图像数据   
|        |        |  之后
|        |        |                                                          
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数据                                                
|        |        |                                                            
|        |        |  起始位置由前一个字段的大小决定;其长度由单项数据大小      
|        |        |  和数据项数目决定(在前面相应的说明字段中给出)            
|        |        |  每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit) 
|        |        |  被认为是属性位。					       
|        |        |                                                            
|        |        |  4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN,
|        |        |  		    字节 3 表示 RED,字节 4 表示属性	       
|        |        |  3 字节表项中各字节依次对应 BLUE,GREEN,RED               
|        |        |                                                            
|        |        |  2 字节表项中,两个字节分解成如下形式:		       
|        |        |  arrrrrgg gggbbbbb					       
|        |        |  但是,由于低位在前,高位在后的存储顺序,从文件中读出表项  
|        |        |  时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。
|        |        |                                                            
|--------|--------|------------------------------------------------------------
| 可变   |  可变  |  图像数据域
|        |        |                                                            
|        |        |  本区域给出了(宽度)x(高度)个颜色表索引这些索引存放
|        |        |  在数据包中;有两中类型的数据包:run-length 数据包,
|        |        |  以及未加工的数据包,每种类型的数据包含有 1-字节的头信息,
|        |        |  (其中指出了数据包类型和数目),其后是可变长度的数据域
|        |        |  头信息中最高位为 1 表示 run-length 类型的数据包,当
|        |        |  它为 0 时,表示未加工的数据包
|        |        |                                                            
|        |        |  对于 run-length 数据包,头信息含义如下
|        |        |      __________________________________________________    
|        |        |      | 1 bit |   7 位的重复记数减一
|        |        |      |   id  |   由于 7 位表示的最大值为 127,故最大  |
|        |        |      |       |   的运行大小为 128,(译注:原文为     |
|        |        |      |       |   the largest run size)          |  
|        |        |      |-------|----------------------------------------|
|        |        |      |   1   |  c     c     c     c     c     c    c  |
|        |        |      --------------------------------------------------
|        |        |                                                        
|        |        |  对于未加工数据包,头信息的含义如下
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的像素个数减一                   |
|        |        |      |   id  |   由于 7 位表示的最大值为 127,故该    |
|        |        |      |       |   类型的一个数据包中像素个数不能大于   |
|        |        |      |       |   128                                  |
|        |        |      |-------|----------------------------------------|
|        |        |      |   0   |  n     n     n     n     n     n    n  |
|        |        |      --------------------------------------------------
|        |        |                                                        
|        |        |  对于 run-length 数据包而言,头信息之后是一个简单的
|        |        |  颜色索引,且假定该索引被重复头信息中低 7 位表示的次数
|        |        |  run-length 数据包也许会跨越扫描线
|        |        |  (扫描线起始于某行结束于下一行)
|        |        |                                                        
|        |        |  对于未加工的数据包,头信息之后是颜色索引(数值由头信息
|        |        |  给出)该类型的数据包也可能跨越扫描线
|        |        |                                                            
--------------------------------------------------------------------------------



--------------------------------------------------------------------------------
|数据类型 10:run length 编码,rgb 图像
|--------|--------|------------------------------------------------------------
|   偏移 |   长度 |                         描述                              
|--------|--------|------------------------------------------------------------
|    0   |     1  |  图像信息字段(见本子表的后面)的字符数		       
|        |        |                                                            
|        |        |  本字段是 1 字节无符号整型,指出了图像格式区别字段长度     
|        |        |  其取值范围是 0 到 255 ,当它为 0 时表示没有图像的     
|        |        |  信息字段。	
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    1   |     1  |  该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示
|        |        |  颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。
|        |        |  提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射
|        |        |        中的第一种颜色
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    2   |     1  |  图像类型代码
|        |        |          
|        |        |  本类型该字段为二进制 10
|        |        |                         
|--------|--------|------------------------------------------------------------
|    3   |     5  |  颜色表规格
|        |        |                                                         
|        |        |  如果颜色表类型字段为 0 则被忽略;否则描述如下
|        |        |  
|        |        |  
|    3   |     2  |  颜色表首址
|        |        |  颜色表首元入口的整型(低位-高位)索引
|        |        |                  
|    5   |     2  |  颜色表的长度
|        |        |  颜色表的表项总数,整型(低位-高位)     
|        |        |                                   
|    7   |     1  |  颜色表表项的位(bit)数
|        |        |  16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|    8   |    10  |  图像规格		                                       
|        |        |                                                            
|    8   |     2  |  图像 x 坐标起始位置                                       
|        |        |  图像左下角 x 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   10   |     2  |  图像 y 坐标起始位置                                       
|        |        |  图像左下角 y 坐标的整型(低位-高位)值		       
|        |        |  		                                               
|        |        |                                                            
|   12   |     2  |  图像宽度	                                               
|        |        |  以像素为单位,图像宽度的整型(低位-高位)值	       
|        |        |                                                            
|   14   |     2  |  图像高度	                                               
|        |        |  以像素为单位,图像高度的整型(低位-高位)值               
|        |        |                                                            
|   16   |     1  |  图像每像素存储占用位(bit)数                             
|        |        |  					                       
|        |        |                                                            
|   17   |     1  |  图像描述符字节	                                       
|        |        |  bits 3-0 - 每像素的属性位(bit)数			       
|        |        |             	                                       
|        |        |  bit 4    - 保留,必须为 0		                       
|        |        |  bit 5    - 屏幕起始位置标志	                       
|        |        |             0 = 原点在左下角        		       
|        |        |             1 = 原点在左上角          		       
|        |        |             truevision 图像必须为 0              	       
|        |        |  bits 7-6 - 交叉数据存储标志		               
|        |        |             00 = 无交叉	                               
|        |        |             01 = 两路奇/偶交叉 		               
|        |        |             10 = 四路交叉		                       
|        |        |             11 = 保留	                               
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|   18   | 可变   |  图像信息字段		                               
|        |        |  包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的   
|        |        |  值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以    
|        |        |  含有 255 个字符。如果需要存储更多信息,可以放在图像数据   
|        |        |  之后
|        |        |                                                            
|--------|--------|------------------------------------------------------------
|  可变  |  可变  |  颜色表数据                                                
|        |        |                                                
|        |        |  如果颜色表类型为 0,则该域不存在,否则越过该域直接读取
|        |        |  图像颜色表规格中描述了每项的字节数,为 2,3,4 之一
|        |        |                                                            
|--------|--------|------------------------------------------------------------
| 可变   |  可变  |  图像数据域
|        |        |                                                            
|        |        |  本区域给出了(宽度)x(高度)个颜色表索引这些索引存放
|        |        |  在数据包中;有两中类型的数据包:run-length 数据包,
|        |        |  以及未加工的数据包,每种类型的数据包含有 1-字节的头信息,
|        |        |  (其中指出了数据包类型和数目),其后是可变长度的数据域
|        |        |  头信息中最高位为 1 表示 run-length 类型的数据包,当
|        |        |  它为 0 时,表示未加工的数据包
|        |        |                                                           
|        |        |  对于 run-length 数据包,头信息含义如下
|        |        |      __________________________________________________    
|        |        |      | 1 bit |   7 位的重复记数减一
|        |        |      |   id  |   由于 7 位表示的最大值为 127,故最大  |
|        |        |      |       |   的运行大小为 128,(译注:原文为     |
|        |        |      |       |   the largest run size)          |  
|        |        |      |-------|----------------------------------------|
|        |        |      |   1   |  c     c     c     c     c     c    c  |
|        |        |      --------------------------------------------------
|        |        |                                                        
|        |        |  对于未加工数据包,头信息的含义如下
|        |        |      __________________________________________________
|        |        |      | 1 bit |   7 位的像素个数减一                   |
|        |        |      |   id  |   由于 7 位表示的最大值为 127,故该    |
|        |        |      |       |   类型的一个数据包中像素个数不能大于   |
|        |        |      |       |   128                                  |
|        |        |      |-------|----------------------------------------|
|        |        |      |   0   |  n     n     n     n     n     n    n  |
|        |        |      --------------------------------------------------
|        |        |                                                            
|        |        |                                                            
|        |        |  对于 run length 数据包,头信息之后是一个简单颜色值,
|        |        |  且假定该值重复的次数为头信息中记录的数
|        |        |  run-length 数据包也许会跨越扫描线
|        |        |  (扫描线起始于某行结束于下一行)
|        |        |                                                      
|        |        |  对于未加工数据包,头信息之后是颜色值(数目由头信息指出)
|        |        |  
|        |        |                                                
|        |        |  颜色表项自身有 2-字节,3-字节或 4-字节几种大小(分别
|        |        |  对应 TGA 16,TGA 24 和 TGA 32)形式如下:
|        |        |  
|        |        |            
|        |        |  3 字节表项中各字节依次对应 BLUE,GREEN,RED               
|        |        |                                                            
|        |        |  2 字节表项中,两个字节分解成如下形式:		       
|        |        |  arrrrrgg gggbbbbb					       
|        |        |  但是,由于低位在前,高位在后的存储顺序,从文件中读出表项  
|        |        |  时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位
|        |        |                                                          
|        |        |  4 字节表项包含了分别代表 blue,green,red 及属性的四个
|        |        |  字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象
|        |        |  TGA 32 类型的图像那样存储
|        |        |                                                            
--------------------------------------------------------------------------------

以上内容转自:http://dev.gameres.com/Program/Visual/Other/TGAFormat.htm

bool LoadTGA(TextureImage *texture, char *filename)    // Loads A TGA File Into Memory
{   
 GLubyte  TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0};  // Uncompressed TGA Header
 GLubyte  TGAcompare[12];         // Used To Compare TGA Header
 GLubyte  header[6];          // First 6 Useful Bytes From The Header
 GLuint  bytesPerPixel;         // Holds Number Of Bytes Per Pixel Used In The TGA File
 GLuint  imageSize;          // Used To Store The Image Size When Setting Aside Ram
 GLuint  temp;           // Temporary Variable
 GLuint  type=GL_RGBA;         // Set The Default GL Mode To RBGA (32 BPP)
 FILE *file = fopen(filename, "rb");       // Open The TGA File
 if( file==NULL ||           // Does File Even Exist?
  fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || // Are There 12 Bytes To Read?
  memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0    || // Does The Header Match What We Want?
  fread(header,1,sizeof(header),file)!=sizeof(header))    // If So Read Next 6 Header Bytes
 {
  if (file == NULL)          // Did The File Even Exist? *Added Jim Strong*
   return FALSE;          // Return False
  else             // Otherwise
  {
   fclose(file);          // If Anything Failed, Close The File
   return FALSE;          // Return False
  }
 }
 texture->width  = header[1] * 256 + header[0];    // Determine The TGA Width (highbyte*256+lowbyte)
 texture->height = header[3] * 256 + header[2];    // Determine The TGA Height (highbyte*256+lowbyte)
   
  if( texture->width <=0 ||         // Is The Width Less Than Or Equal To Zero
  texture->height <=0 ||         // Is The Height Less Than Or Equal To Zero
  (header[4]!=24 && header[4]!=32))      // Is The TGA 24 or 32 Bit?
 {
  fclose(file);           // If Anything Failed, Close The File
  return FALSE;           // Return False
 }
 texture->bpp = header[4];        // Grab The TGA's Bits Per Pixel (24 or 32)
 bytesPerPixel = texture->bpp/8;       // Divide By 8 To Get The Bytes Per Pixel
 imageSize  = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data
 texture->imageData=(GLubyte *)malloc(imageSize);   // Reserve Memory To Hold The TGA Data
 if( texture->imageData==NULL ||        // Does The Storage Memory Exist?
  fread(texture->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved?
 {
  if(texture->imageData!=NULL)       // Was Image Data Loaded
   free(texture->imageData);       // If So, Release The Image Data
  fclose(file);           // Close The File
  return FALSE;           // Return False
 }
 for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel)   // Loop Through The Image Data
 {               // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
  temp=texture->imageData[i];        // Temporarily Store The Value At Image Data 'i'
  texture->imageData[i] = texture->imageData[i + 2];  // Set The 1st Byte To The Value Of The 3rd Byte
  texture->imageData[i + 2] = temp;      // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
 }
 fclose (file);            // Close The File
 // Build A Texture From The Data
 glGenTextures(1, &texture[0].texID);      // Generate OpenGL texture IDs
 glBindTexture(GL_TEXTURE_2D, texture[0].texID);    // Bind Our Texture
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filtered
 
 if (texture[0].bpp==24)          // Was The TGA 24 Bits
 {
  type=GL_RGB;           // If So Set The 'type' To GL_RGB
 }
 glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData);
 return true;            // Texture Building Went Ok, Return True
}

 



posted on 2014-06-04 09:35  NewPanderKing  阅读(942)  评论(0编辑  收藏  举报

导航