随笔 - 132  文章 - 51  trackbacks - 0
<2012年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

常用TGA读取主要分为压缩和非压缩的格式,他们又分为24位和32位读取,切记 TGA格式采用BGR或BGRA逆OPenGL的格式,所以我们用OPenGL画图的时候要转换成为RGB或RGBA的格式,将一三位互换


不全面的原因是 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 的文件格式。 代码里则处理了2,3 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 类型的图像那样存储
----------------------------------------------------------------------------
posted on 2010-05-26 09:40 风轻云淡 阅读(1815) 评论(0)  编辑 收藏 引用 所属分类: 图像读取

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理