原文8 _: r( F& I$ f& Y
http://dev.gameres.com/Program/Visual/Other/TGAFormat.htm
# ]2 z* W" h& K% N0 `/ I ! m% J, V g7 Y7 B( s4 Z/ q" R
根据david mcduffe编写的TGA文件格式资料翻译而成 e( A! o/ ~1 A5 u1 ^" @$ y& }1 e
2 @% u7 ?, E. d7 f- l7 q本文档是为满足许多对 TGA 图像格式的了解需要而创建的。本文摘录自truevision 技术指南的附录 C,如果2 B& F; a/ [! h1 ^% M. I
需要更进一步的信息,请致信以下地址:
- v8 q; p8 ?2 {, N
# [- t' B- T9 V at&t
5 ~) m+ t# O+ |6 w electronic photography and imaging center
$ P+ ?, x6 E, f8 `2 `% x 2002 wellesley ave.' g. v( H6 f0 Y: ?
indianapolis, in 42619
2 M. H! C9 W. ]本文档不求全面,但力求准确。如果你发现了任何拼写错误或内容错误,请告诉我,( david mcduffe,
+ A; d, c/ _+ K9 z75530,2626 ),我将改正这些错误,谢谢。
6 V9 v( n4 F1 d1 M
4 h N& ^. j1 ]. W/ l0 w' M. X! A不全面的原因是 TGA 包含了超过六种图像文件格式,而其中的几种较为常用。 我选择了我现在使用的格式并
( H' g+ a+ P0 ?# i8 e. f% [在本文中加以详解。 如果你需要本文中没有包含的格式说明,你可以与你的 truevision 代理商联系。
W2 ~! u! Q \- ~) F3 D7 H对所有的 TGA 格式的文件而言,其第三字节(二进制整数)用来区别各种不同的 TGA 文件。下面列出了该字( `! ?" ] ]! j) e- K/ d
节表明的对应文件类型: e$ L6 C% U6 @7 V$ O; d+ }
0 - 文件中没有图像数据* x3 G- r) S; s
1 - 未压缩的,颜色表图像) K& b4 Q/ V$ t1 l: a# p n
2 - 未压缩的,rgb 图像: h9 C; I9 o- V0 N, P: l3 }2 A* Z
3 - 未压缩的,黑白图像! X1 R* f# D7 d3 y* t
9 - runlength 编码的颜色表图像
9 W$ ^( O# |4 d6 r+ l6 J, i 10 - runlength 编码的 rgb 图像
4 B7 w1 B; e; f1 u- g5 Y1 ~ 11 - 压缩的,黑白图像
. P% J* Z: I# q N6 H$ f9 i6 ^' Z 32 - 使用 huffman,delta 和 runlength 编码的颜色表图像
% @3 c0 C! G: j, d$ Y$ P2 F4 } 33 - 使用 huffman,delta 和 runlength 编码的颜色映射图像,4 趟四叉树类型处理。
4 O- Z8 d5 K1 N# d8 j2 G 本文仅仅描述对应 1,2,9 和 10 的文件格式。' n: r0 K+ L& G' D
6 M" o+ o: C0 A) x7 U
--------------------------------------------------------------------------------% p. i/ u% `) R0 ?
|数据类型 1: 颜色表(color-mapped)图像
7 T/ G$ A7 _9 I' N( W) }9 E|--------|--------|------------------------------------------------------------+ o; Z7 {9 t) ]0 e5 H) y
| 偏移 | 长度 | 描述! a1 P* Y t9 L) t* |& e; _4 }
|--------|--------|------------------------------------------------------------ `) C' C& F. Y" u
| 0 | 1 | 图像信息字段(见本子表的后面)的字符数 7 g+ z2 Q9 W! U3 s1 v* ]9 H
| | | 9 d+ \0 T P& t- z) M# Q" X
| | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度
( F- x) U$ Y, {: t| | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 + |# I2 h T8 J X& v8 r
| | | 信息字段。
) Y! M( u# f3 x' }% ?( c| | |
7 O3 p8 i, s) F7 B7 a$ X| | |
" y J; T2 e9 q: m|--------|--------|------------------------------------------------------------" E7 B8 B& p% h4 K$ w, M n
| 1 | 1 | 颜色表的类型
9 {1 {6 Q5 s# a| | |
- ?9 T% \! S" B, C# S G| | | 该字段为表示对应格式 1 的图像而包含一个二进制 1 6 f" p! Z) f9 l! h" e2 |# {
| | | ( Y) S; t y& p; ~8 @$ J" o
|--------|--------|------------------------------------------------------------% ^, i F r [3 l
| 2 | 1 | 图像类型码 ( ~3 C6 E1 Q" C/ {( w% I2 D
| | |
~. w5 {$ l8 p+ `| | | 该字段总为 1 , 这也是此类型为格式 1 的原因 ' s; c0 ^' F. @/ `
| | |
. Q7 r& R& X0 E- p7 T|--------|--------|------------------------------------------------------------
% C: Z& o8 d) j0 G6 @+ l| 3 | 5 | 颜色表规格 1 l8 x% J2 {7 m! E. s1 l* Y" \* L7 a" r
| | |
8 B* y) v5 _ |2 H1 F0 ]3 E| 3 | 2 | 颜色表首址 ) q- k% D2 s' F: t* @2 X9 |
| | | 颜色表首元表项的整型(低位-高位)索引
$ Q* ^. q: e. G& ]7 _! A5 T| | |
/ s+ C' P# [% g! `9 E5 U| 5 | 2 | 颜色表的长度
- t! X' J' Y& y, r| | | 颜色表的表项总数,整型(低位-高位) ! {1 A. y ]6 ^- t O9 L- P. v
| | |
. b8 x1 e' ~: ]2 G+ O| 7 | 1 | 颜色表表项的位(bit)数 g& | `6 K9 G( i; M4 r2 ?
| | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA ! t# _. x( L6 W$ K1 ?: K2 q
| | |
, m# [7 [0 r4 h f8 g( n; l| | |
' I E! k4 ^( R S% ? w/ W8 k|--------|--------|------------------------------------------------------------
2 g2 P+ r, Z' p. W+ I| 8 | 10 | 图像规格 ' G2 y' ^9 Z& W p1 {7 a4 T: L
| | | M7 ?/ \1 ~* W$ O( z; [4 F% t% S* e
| 8 | 2 | 图像 x 坐标起始位置
: f+ y! z* w" W" e: P| | | 图像左下角 x 坐标的整型(低位-高位)值
) e' _8 M; [5 @: x| | | 5 l- R) Y+ m7 W8 A4 A% w
| | |
- K) j% b+ Y; G) r) ?| 10 | 2 | 图像 y 坐标起始位置 ( d7 K8 |5 W! D6 {8 D
| | | 图像左下角 y 坐标的整型(低位-高位)值 5 I: r6 v9 N! o% V" N& n
| | |
( T+ K8 M' J& ?4 K/ o% I: f. V| | |
/ U2 c4 ?% |' |0 \ L* f! E' ~| 12 | 2 | 图像宽度 / Q9 E' L9 P2 E! Q$ P5 U7 G
| | | 以像素为单位,图像宽度的整型(低位-高位)值
# @$ U+ T, C6 [8 ?| | | / S4 [2 z5 r' r* M3 Q
| 14 | 2 | 图像高度 : `- }* O/ N5 {$ y X
| | | 以像素为单位,图像高度的整型(低位-高位)值 ! ^7 z6 ]' j% h6 q/ y d
| | |
8 ^+ E2 c) t) i! E8 k6 V1 q| 16 | 1 | 图像每像素存储占用位(bit)数 % x% J. l; v: X z
| | | 1 }& L; _7 u# z5 O
| | | . L0 T; k3 r2 }+ }
| 17 | 1 | 图像描述符字节 . Y/ t7 u1 x* O- `; U
| | | bits 3-0 - 每像素的属性位(bit)数 4 d) D$ y ?) A, Z+ R- D+ u2 c
| | |
2 D$ c. x5 _* d; c7 l( || | | bit 4 - 保留,必须为 0 5 N/ S" m3 A2 i
| | | bit 5 - 屏幕起始位置标志 ( Q, V' _* C, i$ _, L
| | | 0 = 原点在左下角
3 ?- z4 v! m7 H0 R- n2 l; \| | | 1 = 原点在左上角
3 a. {$ {0 r5 E! T2 m X) k2 K| | | truevision 图像必须为 0
2 s! A) }, o; q5 u. d" `| | | bits 7-6 - 交叉数据存储标志
1 d8 N& Q: f6 l) S: r| | | 00 = 无交叉 P' U7 {- F z! }6 H) [
| | | 01 = 两路奇/偶交叉 6 v7 s: ^. p3 ~2 ]
| | | 10 = 四路交叉
" r' b, s9 B- Z) i# j| | | 11 = 保留 ! N3 q+ N$ u3 x& A% Q, X a
| | | 这一项应该设为 0,不要问我为什么
+ Q1 r0 w" c3 ^| | |
0 H6 A9 e7 O* @" |8 c|--------|--------|------------------------------------------------------------# {0 Q) |% `1 v: [# P6 n. P3 {/ o# k
| 18 | 可变 | 图像信息字段 + T5 j$ g5 |3 [" v
| | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的
. S* m0 v0 N+ }5 K* Y2 U| | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以
% A- |4 a8 s* R8 q" K| | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据
9 m7 F9 m' V4 R( e3 N4 \# }| | | 之后
7 f& I* v/ M1 i' p| | | 2 t1 K L5 o, \2 G$ X4 Q
| | |
2 X! D( m' ~/ U& r: _8 p|--------|--------|------------------------------------------------------------% {7 j* Q' Q$ ]. h/ q4 q
| 可变 | 可变 | 颜色表数据
% S3 R4 x8 j X# T# l) E| | | + G% @6 I. _( I+ l: E1 `4 [
| | | 起始位置由前一个字段的大小决定;其长度由单项数据大小 + k! x4 w; J) W
| | | 和数据项数目决定(在前面相应的说明字段中给出) 6 n: v" S1 ]; v% G9 v& u. E7 h; P
| | | 每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit) : G5 I9 U; T ~0 Y
| | | 被认为是属性位。 9 g+ z: i! C W5 R0 O" L4 D, R
| | |
' ]& h1 m) r* ^, j$ G| | | 4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN,( h- @8 g) `: r. c) @/ }9 A
| | | 字节 3 表示 RED,字节 4 表示属性 ) Q% W9 T1 R( X$ T9 U. i
| | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED
) g: O, [+ S9 Q7 }| | | & q9 C" W( z/ _: w- \
| | | 2 字节表项中,两个字节分解成如下形式: ; Z+ k* U5 x- S( p7 L% X7 Z
| | | arrrrrgg gggbbbbb
) E# N# \- B; m( d) p7 d( R| | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项
, }' e0 ?) o3 d' }7 e| | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。 5 {1 n$ m% K. ^& E C* | L' f
| | |
" g3 `" X, @. |- l$ `|--------|--------|------------------------------------------------------------
% o( F# }% \0 i, z| 可变 | 可变 | 图像数据字段 ' O, L& o q# B4 R, f+ G, Z
| | | ' b" @7 p, i m& l
| | | 该字段给出了 (高度)x(宽度)个颜色表项索引,每个索引 $ {1 o- C' M5 E }" U2 N
| | | 以整数个字节的形式存储(典型的例子如 1 或 2 个字节)
1 }3 m3 y5 A+ P" n| | | 所有的数据都没有符号,对于 2-字节表项而言,低位字节是
0 y7 @% X L3 Y7 f7 g ?2 w5 \1 m| | | 先存储的。 ) N, S0 I3 Y# p/ _& x' d: M
| | | ' U& E! n4 S; p6 E8 A* M7 m3 |
-------------------------------------------------------------------------------7 \6 k* F) k. {
s3 d x; Z" X( N1 G- D( E
& ?$ Q+ y6 Y+ C! ]( u, Q4 D# u5 g
; V( Q+ n/ D3 C. c' d/ \--------------------------------------------------------------------------------8 `* Q% R% j8 X9 b$ u6 B
|数据类型 2: 无颜色表 rgb 图像 S5 \. j! b( S$ ?: D! ]
|--------|--------|------------------------------------------------------------' `, w% q% P$ [" G4 J
| 偏移 | 长度 | 描述 ! _& V/ }- M- ?. d
|--------|--------|----------------------------------------------------------
4 h* T2 \7 Z" C8 W| 0 | 1 | 图像信息字段( 见本子表的后面 )的字符数2 I- z8 Y9 R& f5 {
| | |
: f/ u! C4 m8 f+ ^( ]| | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度' c$ v) H; ^1 a& F" u
| | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的4 H. {! K7 \' }6 v0 Q( K
| | | 信息字段。) p) K1 {% ]: V1 J4 ~
| | |
3 Z- h0 z3 T" A|--------|--------|------------------------------------------------------------4 l- ], A: g( V0 a$ S
| 1 | 1 | 颜色表类型
1 u6 @: h2 Y6 ?1 d8 i| | |
6 w7 O& F# ]( || | | 该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示* O3 \6 x* a1 d7 W% j; O% b3 X+ R
| | | 颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。
7 Z! S+ B! g' U7 F6 S" H1 L| | | 提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射
( a' ]5 w; Q; O/ U- n% B/ x: m| | | 中的第一种颜色
5 p- G- c" W3 g: J| | | % E9 b- \* [1 \0 E2 E& z4 n
|--------|--------|------------------------------------------------------------3 ?0 \% a- R& N- O
| 2 | 1 | 图像类型码
3 q# A) @3 q3 j| | |
. q) E' B: ]4 g6 X+ h1 G) w| | | 该字段总为 2 , 这也是此类型为格式 2 的原因 " ?# {! G) K8 K8 ~; L; j/ b: m
| | |
3 k \! m/ _% z; h2 ~/ y# G. d/ j|--------|--------|------------------------------------------------------------! _7 |/ O: G1 R5 |
| 3 | 5 | 颜色表规格
' v* k0 c/ K! B0 W( k| | | , F }7 c9 r, m n7 P, v& i- |
| | | 如果颜色表类型字段为 0 则被忽略;否则描述如下1 ^% e r0 ~. A( f
| | | & E' M+ l+ X2 x
| 3 | 2 | 颜色表首址
) t, I1 q. Q' S5 ?. d; q| | | 颜色表首元入口的整型(低位-高位)索引; z, D' N' u8 \: }' H& g
| | |
8 S( u! {& R- W/ r( t| 5 | 2 | 颜色表的长度* _) ?4 J: w" C
| | | 颜色表的表项总数,整型(低位-高位) 7 F# O8 C: |( A8 R9 S+ Q
| | |
- D. f8 J0 w8 P Z' Y9 w. ~| 7 | 1 | 颜色表表项的位(bit)数" t, R$ X: m3 x# f
| | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA7 M4 M) c# K9 h7 `! o; H
| | |
* Y5 b. O* L& x. F| | |
# f" j$ F: N: z* j" L5 M|--------|--------|------------------------------------------------------------0 a3 V% `6 J8 X+ v+ l+ A
| 8 | 10 | 图像规格4 y" F, b3 x0 N _
| | | $ B3 h1 i/ ~# h8 a3 z
| 8 | 2 | 图像 x 坐标起始位置
9 ?3 r% |6 X7 D3 P$ ^| | | 图像左下角 x 坐标的整型(低位-高位)值7 G4 V/ _; ?9 ~. O4 Y1 ^ {4 ?
| | | & T' `6 b" Y- T( p2 X' s' p
| | |. ]' y$ C8 C! B4 a, J
| 10 | 2 | 图像 y 坐标起始位置) u" p* |) ?0 l
| | | 图像左下角 y 坐标的整型(低位-高位)值; E* |3 I! b5 e2 j% ?* |( @5 D
| | |
6 d$ d: ~% ?& d" |8 S3 L| | |; i; c2 F8 m) R$ [7 D" P! F0 B
| 12 | 2 | 图像宽度
1 E! W4 Y0 e. {: i: E- r| | | 以像素为单位,图像宽度的整型(低位-高位)值, z, ^5 n% P$ J# R# e3 @
| | |
8 Q3 a+ f f" R+ Q| 14 | 2 | 图像高度
& i; q( M5 L8 |1 r8 S| | | 以像素为单位,图像高度的整型(低位-高位)值) E8 l. J" ^3 @( S8 A
| | |
) S0 B8 v9 z6 c4 E8 ^| 16 | 1 | 图像每像素存储占用位(bit)数
/ g0 O3 w& Z x$ q2 b| | | 它的值为16,24 或 32 等等决定了该图像是 TGA 16,TGA24: q @# C; @, O0 O8 U1 \" ?
| | | TGA 32 等等
- ~9 D7 B/ Z+ T5 C| | |
; [4 Z2 I3 P' I; H8 s7 X6 Z4 U| 17 | 1 | 图像描述符字节
: @! a% }, x: q ^& {% v t| | | bits 3-0 - 每像素对应的属性位的位数;对于 TGA 16,
/ r/ r/ N* ^+ \9 H6 ]/ e| | | 该值为 0 或 1,对于 TGA 24,该值为 0,. Q3 W8 X" q9 w" K+ T+ p4 {5 ]
| | | 对于 TGA 32,该值为 8
* U% z% q0 z ~) p- `& m: Q: U| | | ! k3 Q& s1 p& x6 M# l# U
| | | bit 4 - 保留,必须为 0
7 e1 s7 y( T i7 {$ ^+ J| | | bit 5 - 屏幕起始位置标志0 u* m# k# D# C- h5 f3 W& y
| | | 0 = 原点在左下角( |, |* P( g) m& {! l
| | | 1 = 原点在左上角0 ~0 @& M7 G! L) [
| | | 对于 truevision 图像必须为 0
# i4 c& m8 u) ^# v3 D7 l) y! B| | | bits 7-6 - 交叉数据存储标志, Z: G5 D5 C. }/ U' i
| | | 00 = 无交叉 9 E' D- O* d( }7 e# n
| | | 01 = 两路奇/偶交叉
6 M/ ~8 ], S( \! q| | | 10 = 四路交叉 - w" Y, ^( L& ^, S6 ~# l
| | | 11 = 保留
3 f" V& w: ?: r: r2 K* \$ d| | |
4 N7 ~5 W' o/ W, o|--------|--------|------------------------------------------------------------
" p. o$ d; m8 X* N& v: ]7 I| 18 | 可变 | 图像信息字段 0 i% \: X: f+ y, ^$ T9 ~" J* |
| | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 ) T4 @9 r: C! c# C
| | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 6 I4 v2 P0 `0 @ R7 S% W) y
| | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据 " l& v3 f0 h' n7 ^ E& l3 U; U
| | | 之后 7 s- x6 Q# Y: g5 u4 F; y
| | | ( T2 j& E4 e$ \
|--------|--------|------------------------------------------------------------" A/ }8 {$ |4 ~* k9 J) v& \' W
| 可变 | 可变 | 颜色表数据
3 P7 }% ~ B% e+ V9 g; `8 ?| | | 7 }; E# S2 m7 s* @2 C, F
| | | 如果颜色表类型为 0,则该域不存在,否则越过该域直接读取
5 ~& w6 f6 S+ Z3 p w| | | 图像颜色表规格中描述了每项的字节数,为 2,3,4 之一3 {0 I2 k; b0 G1 R7 U9 |
| | | 6 X, S8 Y+ u5 e; d6 E
| | | 1 Y! r j: Q' l2 H7 P' u
| | | & e& P w C; C* y! x+ U' U Q
| | | 3 s* B+ Z5 k0 H( O0 [( ~7 }
|--------|--------|------------------------------------------------------------
7 r; I3 ?; A" b/ H: z| 可变 | 可变 | 图像数据域$ ^( b8 c' n/ u: X0 C
| | | 5 s, A/ i' ^* W4 @
| | | 这里存储了(宽度)x(高度)个像素,每个像素中的 rgb 色值
0 V/ E9 X$ N1 ~2 m! ^; w8 w| | | 该色值包含整数个字节
- \0 A, o. u2 m6 d9 v) T| | | ( G% e' ?0 K/ M( n3 a
| | |
' g* G" p. j3 z4 Z/ u3 I8 A3 b; b| | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED $ J) a& z9 l3 c3 A
| | | / G1 p1 _) w: G0 Z
| | | 2 字节表项中,两个字节分解成如下形式:
2 r- a' p+ c. R1 D5 F- z; R/ Q. n& q| | | arrrrrgg gggbbbbb
6 N" Y2 v' y; T# o- F4 r| | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项
- r% o% |- ]+ c| | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位+ X$ P: F6 g5 a, ~% q
| | | " E$ `! k# I$ |( M5 W4 ^- h' h
| | | 4 字节表项包含了分别代表 blue,green,red 及属性的四个: ~% q2 B" a& n, s' M
| | | 字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象$ {8 [, @/ q( L1 X" k# g( d
| | | TGA 32 类型的图像那样存储& V8 C9 l6 E1 A: y
| | |
* V% [1 Z# B7 v5 t1 } B| | | 4 b" a! i+ O8 P! B5 J. g5 W% |
--------------------------------------------------------------------------------
$ e- i8 ~ v( R4 J3 c9 E, w5 B, K& D, n+ c g4 c* D8 L
, N% c+ Q- C" k6 e; r
' E4 [; a) N1 n" o, G% U; _: e e- \* C5 H! Q
--------------------------------------------------------------------------------7 O4 ^$ ?* Q& d! q* P& s
|数据类型 9: runlength 编码,带颜色表的图像& c2 c! d% h2 e5 D# a0 B
|--------|--------|------------------------------------------------------------
4 w, U, w, S$ d9 W! e| 偏移 | 长度 | 描述7 q3 X* p+ |3 g( T: f, p5 @, l
|--------|--------|------------------------------------------------------------
' w3 j6 ?9 `! }; B| 0 | 1 | 图像信息字段(见本子表的后面)的字符数 0 F- |' e* o# A0 t, e, w6 J- \+ C
| | | 2 f- N/ k6 ^' @* ]0 B7 [$ M
| | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度
' ~8 x' O: t \+ F/ J: L# q t2 `| | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 ! v! Y1 ]" Z6 o8 W
| | | 信息字段。 2 f7 ^5 x5 ~) K- Y v. r/ D- D
| | | : A" Y2 @- b: ?* ]6 C
|--------|--------|------------------------------------------------------------' T% ?4 I _8 \6 w0 H. U
| 1 | 1 | 颜色表的类型
- h( l7 P1 n: B3 t$ U2 V| | | - U+ s4 ^5 n/ H) f3 c
| | | 该字段为表示对应带颜色表的图像而总为 1
' u; r4 B8 c- ?# _| | | M5 b! o5 L+ ?- o, `
|--------|--------|------------------------------------------------------------8 r' t- j# q) {- M9 T: b" S5 X
| 2 | 1 | 图像类型码
5 e5 w. L' f9 J0 L, I, B! e| | |
" y; S" c! \* c+ ~# ~% F| | | 本类型该字段为二进制 9
: }! A! W* M# c: { w| | | 3 a9 R1 z/ x' [; y; @: \
|--------|--------|------------------------------------------------------------' l, m' Y6 a; L* j5 v6 F
| 3 | 5 | 颜色表规格
R7 i! i ]* @, W: {| | |
p0 [/ b* \( c' s| | | 如果颜色表类型字段为 0 则被忽略;否则描述如下5 Q0 i8 _+ `7 B F: h" _; h$ k8 R3 g: o6 S
| | |
5 ]8 R4 d1 X# a5 v7 U4 a| | |
1 M% \, [! N3 b I; o! L| 3 | 2 | 颜色表首址' L# o5 i: [$ v# S" l d
| | | 颜色表首元入口的整型(低位-高位)索引
/ y) N' E5 c' l, C2 R| | | 9 g& A' n- E& m, Z
| 5 | 2 | 颜色表的长度
8 z O- B; h0 T! P" K. ]% W| | | 颜色表的表项总数,整型(低位-高位) ' ~9 G" q: a) G0 `; p+ @6 s. s
| | | 3 x. M0 O8 m. B6 q* Q
| 7 | 1 | 颜色表表项的位(bit)数
3 V7 w3 u! ~" m/ z: x- U) ~| | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA# ]! c- ^% ]3 I% b2 K! X3 @
| | |
* |5 D" H! g0 Z9 S9 T& {3 Q|--------|--------|------------------------------------------------------------
! R+ |" } v- F, s) I2 A0 `: T8 u( m- B| 8 | 10 | 图像规格
/ U5 U# v9 `8 J8 Y2 [1 e) `| | | ( |7 T9 q2 @$ {$ i" y1 c; k
| 8 | 2 | 图像 x 坐标起始位置
3 f3 E7 E9 y/ [1 |2 g7 r| | | 图像左下角 x 坐标的整型(低位-高位)值 9 e4 }0 e! N4 C _
| | |
/ c/ B; ]( p7 G7 |8 ~| | |
$ K5 ]' U3 X9 T% l) l: a| 10 | 2 | 图像 y 坐标起始位置
1 f- U& Y8 Q" U3 p" U5 h. ?7 c0 t| | | 图像左下角 y 坐标的整型(低位-高位)值
5 m3 V, k1 W1 T9 R9 |! F( n| | |
i, a2 w2 d; C1 N5 N| | | $ d( _- i8 s) a, T" S, K
| 12 | 2 | 图像宽度 2 h4 _! |; ^8 p! \. w1 R
| | | 以像素为单位,图像宽度的整型(低位-高位)值 0 X3 K) f/ Y3 x0 ~% p# _& C
| | |
: h1 W+ S/ l) `4 ?- e# ^ r* B2 Q6 A| 14 | 2 | 图像高度
2 ~* F9 z+ X0 v0 C" [7 R| | | 以像素为单位,图像高度的整型(低位-高位)值 z% s7 k$ S# l6 V3 y3 o
| | |
- |, V8 O& q6 {9 w| 16 | 1 | 图像每像素存储占用位(bit)数 . z. ]; ~; c6 A$ M' ~: u9 @
| | | , `% W: e- U, j9 L+ c* |% q
| | |
) P l3 Y9 v" F6 R; s7 o| 17 | 1 | 图像描述符字节
9 L% W3 m) k. R0 n! b& I| | | bits 3-0 - 每像素的属性位(bit)数
& s, v2 b( G; Y| | | 5 P3 _6 n( ]8 y
| | | bit 4 - 保留,必须为 0 9 p1 T2 m5 F+ O- x0 a' v
| | | bit 5 - 屏幕起始位置标志
3 P. i5 S1 J* f- d3 i/ S- f) g- l7 D| | | 0 = 原点在左下角 + @9 A; [; A' E4 O1 ^0 V
| | | 1 = 原点在左上角 , \0 V6 Y; F$ p8 B
| | | truevision 图像必须为 0
5 e+ Q4 h* c$ e- I5 h* s| | | bits 7-6 - 交叉数据存储标志 2 ^ e. H+ K! \
| | | 00 = 无交叉 : e( b2 ^4 G& @5 M
| | | 01 = 两路奇/偶交叉
/ x) o% z, T% Y4 }" D| | | 10 = 四路交叉
8 Z+ _5 | x r, z" p" u| | | 11 = 保留2 b5 ?3 F* F' N K
| | | % g2 B' S1 k7 a6 S( Y% C' J+ P
|--------|--------|------------------------------------------------------------+ D2 j5 `" k$ n5 W# N! F b4 S H7 @
| 18 | 可变 | 图像信息字段
% }4 E* m. { J3 i( N- M6 c, ]| | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的 , o1 t- D8 ]: x7 T9 x
| | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以
5 c4 l+ }8 B0 S- X* n4 q' V| | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据
% p4 A1 j# q; v! P; J l% k| | | 之后
5 g. d- e! U" i8 ? j r| | | ( w. V6 c$ F0 t
|--------|--------|------------------------------------------------------------
# D0 o, m" d; r( p1 n% I2 ]& f| 可变 | 可变 | 颜色表数据 O0 _- \$ B& a0 |; w
| | | 5 T! I9 H* I+ X8 u" n. N
| | | 起始位置由前一个字段的大小决定;其长度由单项数据大小
2 J" ~! u. v! e) Q9 ^5 U! }| | | 和数据项数目决定(在前面相应的说明字段中给出) 0 s. O" @/ O. L$ K8 i, K; u( G* I
| | | 每项是 2 字节,3 字节或 4 字节,字节中没有使用的位(bit)
# E4 I' z, r, c4 N5 e| | | 被认为是属性位。
3 H4 o- s8 b$ Y$ p( T0 F1 y0 }7 c| | | 3 Q) w! l' |0 y8 T: u N
| | | 4 字节表项中,字节 1 表示 BLUE,字节 2 表示 GREEN,( B' K7 m! [$ z
| | | 字节 3 表示 RED,字节 4 表示属性
, R" S; f# ?! {| | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED * L2 p* X2 S& l" o# R
| | | 7 `1 i- l- E4 o) r2 A: E
| | | 2 字节表项中,两个字节分解成如下形式:
+ J# V5 d5 ~: i, d4 [0 B: _$ p( O| | | arrrrrgg gggbbbbb
8 k. a8 f& Z$ v| | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项
, E# a5 |; U% h. u2 l| | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位。/ x) |0 S: ~- K9 `7 E; y
| | |
) f) b7 u$ R2 [& u2 a/ S|--------|--------|------------------------------------------------------------# b9 L; e3 {+ [* H$ f" u- d! P
| 可变 | 可变 | 图像数据域1 X1 T5 m4 U ?4 f4 l& s
| | |
' ]3 y, X3 C) T% ~* h| | | 本区域给出了(宽度)x(高度)个颜色表索引这些索引存放
$ c* z( W6 @/ X1 x5 q* i| | | 在数据包中;有两中类型的数据包:run-length 数据包,
2 x8 u# m3 ~1 ]& }9 a2 l% B _| | | 以及未加工的数据包,每种类型的数据包含有 1-字节的头信息,# _7 t4 \+ T' o, A) l( Q
| | | (其中指出了数据包类型和数目),其后是可变长度的数据域5 i$ D8 F. U2 g7 n: W8 x" N
| | | 头信息中最高位为 1 表示 run-length 类型的数据包,当
2 g1 v0 R. A, R& _| | | 它为 0 时,表示未加工的数据包8 N/ j% W9 l, m1 Q
| | | + ]7 @% X6 S. d2 {0 Y
| | | 对于 run-length 数据包,头信息含义如下; D# Q8 T. u5 r8 @; Y5 H
| | | __________________________________________________ + q; {4 `$ u! r0 [- \* g' R& }+ q" \
| | | | 1 bit | 7 位的重复记数减一4 U4 ]' S5 o" t, i. Z* r0 q
| | | | id | 由于 7 位表示的最大值为 127,故最大 |
9 S- _1 k3 [) C0 S. g5 M| | | | | 的运行大小为 128,(译注:原文为 |
M, _1 s% C; X| | | | | the largest run size) | & G% A& C" O c
| | | |-------|----------------------------------------|3 J- j- C: o4 t) C1 J, ~
| | | | 1 | c c c c c c c |/ I- S3 k8 @% Z- d1 f
| | | --------------------------------------------------
) Q; U" ~+ y6 \$ Y& O( [| | |
6 D6 @3 M: b5 x P: `: M8 x| | | 对于未加工数据包,头信息的含义如下* B+ Z9 ^* P0 m0 n" F2 W8 Y
| | | __________________________________________________
2 W9 O, P) r! S1 T i; f0 s# ?| | | | 1 bit | 7 位的像素个数减一 |
5 ~: f3 o3 T/ @$ V4 P+ Q0 @| | | | id | 由于 7 位表示的最大值为 127,故该 |
7 H% ^% h5 E9 M6 k6 b| | | | | 类型的一个数据包中像素个数不能大于 |
% m8 a8 o: [# B$ K, h8 }| | | | | 128 |
2 `% Z6 c1 Q* f: C% @$ b1 X| | | |-------|----------------------------------------|& ]# k8 T8 h, X& d4 E7 Z9 a$ F
| | | | 0 | n n n n n n n |$ E6 ?$ O& ]# ?. a' P% @
| | | --------------------------------------------------0 _/ \+ C r6 r- M6 J, {; I
| | | 0 r; e# E; p& F8 u! A0 H
| | | 对于 run-length 数据包而言,头信息之后是一个简单的
% J8 X8 M5 r! T2 }8 @7 m0 k| | | 颜色索引,且假定该索引被重复头信息中低 7 位表示的次数2 H* Y! ~6 z& u1 ^( y
| | | run-length 数据包也许会跨越扫描线
2 x9 k) x/ U% J" ^5 _| | | (扫描线起始于某行结束于下一行)) p9 R7 m v; `* r
| | |
% Z( R' c7 K: [) I| | | 对于未加工的数据包,头信息之后是颜色索引(数值由头信息
$ |5 n4 \: Y4 P5 k| | | 给出)该类型的数据包也可能跨越扫描线
5 j$ _7 a1 O& m' a+ C/ [| | |
, ]9 M" Z6 G2 J# b& a0 l--------------------------------------------------------------------------------
5 G& x; n+ o j2 l6 ^- J A% A3 U; X& f% o* ?+ }1 ?- N
& q6 n! J- Z8 ]4 @
- _6 v) v$ z$ ]* e- S
1 |8 [+ |: @( E3 [. e8 \--------------------------------------------------------------------------------
/ {" J' U5 K- P4 d" l# H|数据类型 10:run length 编码,rgb 图像+ E# b$ C$ b+ g" j4 C( Y
|--------|--------|------------------------------------------------------------3 `& t3 c7 H. z. b
| 偏移 | 长度 | 描述 , t- w. U( W* t( Q
|--------|--------|------------------------------------------------------------. @* B) d) \; A) e& ?) K
| 0 | 1 | 图像信息字段(见本子表的后面)的字符数
- ?9 a) O4 o/ Z7 m| | | ) Y$ a/ F/ `& x5 F
| | | 本字段是 1 字节无符号整型,指出了图像格式区别字段长度
1 t' v- F' k0 K+ ?; B8 z. \| | | 其取值范围是 0 到 255 ,当它为 0 时表示没有图像的 . H1 t& ?9 c4 i) e" D/ H6 W \
| | | 信息字段。
! o; q0 w2 Y# g5 z, A% }# H2 E* o| | | * o {$ w1 p6 o1 @
|--------|--------|------------------------------------------------------------* R8 L! U% a2 K: s! a# ?
| 1 | 1 | 该字段的内容或者为 0 或者为 1;0 表示没有颜色表,1 表示! h2 P( m& [# |. Y6 U
| | | 颜色表存在。由于本格式是无颜色表的,因此此项通常被忽略。" z3 P+ a8 [. ?0 m
| | | 提示:如果置为 1(targa 绘画程序)将把边框颜色设置为映射
- Q! z B2 m* {7 y$ z w, || | | 中的第一种颜色% e1 w- c% b: m# G; C
| | |
0 W }! A6 D6 h4 F1 q# `- F: [|--------|--------|------------------------------------------------------------2 v) X6 t% s6 @+ E+ c' Y M; J
| 2 | 1 | 图像类型代码9 s" X3 h$ m1 v& ~6 O/ f
| | | ) H1 n$ L( s5 p( g; r8 [/ _
| | | 本类型该字段为二进制 10+ u+ T( o7 D: z& ^( R: a) W
| | | 4 k# x7 D- |5 g
|--------|--------|------------------------------------------------------------8 Z6 m% B/ k! v) L
| 3 | 5 | 颜色表规格) B( @' R9 n: G* W) E8 x
| | | 6 Z3 O F2 g4 ?
| | | 如果颜色表类型字段为 0 则被忽略;否则描述如下# O- z4 l' u# b& D% D+ r) A' L! W
| | | , M( J8 W" c. t9 ^
| | | 0 O9 x! E/ |% I+ D
| 3 | 2 | 颜色表首址9 ~; }4 _0 o3 A/ |3 `# y
| | | 颜色表首元入口的整型(低位-高位)索引
% l# v' n- B1 N# R& `9 B) Y4 g1 u| | |
I: z4 O- m& W6 d5 `9 k* I| 5 | 2 | 颜色表的长度
6 @: S3 V$ E3 E6 _| | | 颜色表的表项总数,整型(低位-高位) , G" ?/ x4 b* x* s; v7 C
| | |
/ t# c7 Q0 M7 l1 u0 j8 U; q| 7 | 1 | 颜色表表项的位(bit)数
8 }, Z% ?; S* L1 {8 D| | | 16 代表 16 位 TGA ,24 代表 24 位 TGA ,32 代表 32 位 TGA9 x/ j0 y5 R) _4 A1 Y' [& q4 b
| | |
8 |; c! s- v4 m# t& h, n|--------|--------|------------------------------------------------------------
; t `$ S8 |+ ~* q( x| 8 | 10 | 图像规格 # u6 V S4 S" g# I' F
| | | 8 X L. y1 b& o& n& n' C& `! `* V B- G8 D' U
| 8 | 2 | 图像 x 坐标起始位置
1 K# y" |1 _4 m4 k) k6 f* U, b| | | 图像左下角 x 坐标的整型(低位-高位)值
" @; _/ }5 X s| | | + E# j7 f$ H1 i3 D1 y5 ~+ r
| | | ) ?0 i0 R: M$ ^8 T
| 10 | 2 | 图像 y 坐标起始位置
5 l, }; f$ v! n; y7 I; Y' G| | | 图像左下角 y 坐标的整型(低位-高位)值 6 Z( ^- m5 G, C6 b" ^% t' \$ A0 p- {
| | |
7 A- P; \! j( l/ V& O| | |
* o0 z* r0 a; p6 _3 Y: n% k: ?1 z| 12 | 2 | 图像宽度
5 e1 y& i9 @3 v1 }6 N8 V9 i| | | 以像素为单位,图像宽度的整型(低位-高位)值 ) {& @# m1 \2 S+ f8 j
| | |
! f% H) z2 u3 I, j: }6 T" o M| 14 | 2 | 图像高度 & p) g$ _! S o0 a3 B
| | | 以像素为单位,图像高度的整型(低位-高位)值
( e2 Z: G! I5 v" `| | |
* {6 t0 t7 h. Q, l. {2 u' I| 16 | 1 | 图像每像素存储占用位(bit)数 , U1 A+ u1 h% R6 l+ _6 _3 ^0 N7 c
| | |
! g+ l! Q& L6 n0 q| | | & K* @% O) O& b$ o
| 17 | 1 | 图像描述符字节 * v" K$ j: \+ O0 }" l
| | | bits 3-0 - 每像素的属性位(bit)数
4 P1 F# M$ `( g! f5 l6 R| | | ' q& o( W9 |7 ]4 ]9 h* E( _, e
| | | bit 4 - 保留,必须为 0 9 T2 Y6 z6 E5 R" V2 y" b
| | | bit 5 - 屏幕起始位置标志
# K" k- ]5 V# m' o| | | 0 = 原点在左下角
" t" Z2 S8 Q2 x! D* b4 R7 d& y| | | 1 = 原点在左上角
+ J5 _4 W' ?3 G6 ?| | | truevision 图像必须为 0 * r8 ^" _" q: w/ H+ X; t0 a8 E5 o s
| | | bits 7-6 - 交叉数据存储标志 ) v* x- i$ p' j8 \; `$ P
| | | 00 = 无交叉
, U* Q% @) R8 {: v: j( H| | | 01 = 两路奇/偶交叉 $ M* I; b% J* W1 r/ R% f
| | | 10 = 四路交叉
$ M: j0 I/ T9 I# V6 d8 X7 z J* T| | | 11 = 保留
9 L+ R) H' k: e' ?3 {- Q4 S| | |
6 x8 S6 r4 R: D( \* R|--------|--------|------------------------------------------------------------
: {/ o. I$ ~; S| 18 | 可变 | 图像信息字段
0 g5 x. ]3 f, ^& F; }# v! ^| | | 包含一个自由格式的,长度是图像记录块偏移 0 处的字节中的
0 y$ d: B. d* `& Y2 c- M7 M| | | 值。它常常被忽略(即偏移 0 处值为 0 ),注意其最大可以 + M: A' ~" E, x( w0 o4 L4 K
| | | 含有 255 个字符。如果需要存储更多信息,可以放在图像数据
: {6 v! A9 W. m. Q0 x| | | 之后
& s; l- C+ m' m) R: s* {| | |
6 y/ q' D+ {( ~+ v' b|--------|--------|------------------------------------------------------------# ]$ v# e' z, h! a
| 可变 | 可变 | 颜色表数据 3 T$ U6 I6 g/ ^' ?. S0 a9 [* Q
| | |
" f1 R/ e% S& [8 f+ T3 C| | | 如果颜色表类型为 0,则该域不存在,否则越过该域直接读取+ U( C0 r" v. G1 t) E1 h
| | | 图像颜色表规格中描述了每项的字节数,为 2,3,4 之一
: o# n- ]9 o& l8 n8 D| | |
( A8 r m) B: X3 M9 K/ ]& R; L" Y|--------|--------|------------------------------------------------------------
: X: M B$ }! x3 H; `1 h4 g| 可变 | 可变 | 图像数据域3 I6 r, }3 i' g, r, f X( y
| | |
* u% w) @ U; _& H) ]' |+ t| | | 本区域给出了(宽度)x(高度)个颜色表索引这些索引存放. ~" T c' M! A. r8 p, R5 L) W7 X9 T. U; ^
| | | 在数据包中;有两中类型的数据包:run-length 数据包,
5 f/ `$ E" W' [: _5 [! u* X: @5 T/ Z) }| | | 以及未加工的数据包,每种类型的数据包含有 1-字节的头信息,$ ?0 a- z* M/ I8 [
| | | (其中指出了数据包类型和数目),其后是可变长度的数据域) r9 e0 k: }1 F
| | | 头信息中最高位为 1 表示 run-length 类型的数据包,当0 `9 d& G0 h3 M6 _+ W/ `, B
| | | 它为 0 时,表示未加工的数据包
. l# D7 w }0 M| | | 7 ?/ A1 n) M b4 g6 Y
| | | 对于 run-length 数据包,头信息含义如下7 U+ v# l7 l5 Z9 D, J* l
| | | __________________________________________________
" r2 J/ @+ t6 @| | | | 1 bit | 7 位的重复记数减一
9 K) J N# o2 F5 C6 J2 Y1 c| | | | id | 由于 7 位表示的最大值为 127,故最大 |2 ?- U7 B0 x" L1 h$ Q( e5 k' H ?
| | | | | 的运行大小为 128,(译注:原文为 |2 T0 T* V* l: J
| | | | | the largest run size) | , Y3 C1 Z( E: B6 G
| | | |-------|----------------------------------------|
" a' k( f6 `3 Q; i9 I B| | | | 1 | c c c c c c c |
5 d; E; k$ J+ Y0 n+ k1 A| | | --------------------------------------------------
1 f" j% m4 ]; e: z8 L| | | 4 H! P- O. w3 E+ s+ K$ V
| | | 对于未加工数据包,头信息的含义如下1 F b# M2 ?+ O4 i, @0 K2 Y
| | | __________________________________________________
' i( |) _. Z" `| | | | 1 bit | 7 位的像素个数减一 |% M( ~' `, F& C" v3 B+ b! x
| | | | id | 由于 7 位表示的最大值为 127,故该 |' `0 c' @4 T8 g' H' l( S
| | | | | 类型的一个数据包中像素个数不能大于 |' _4 V" d9 j5 M9 T, B, B
| | | | | 128 |1 P) Y: ]: c; Y: T1 l' x1 b
| | | |-------|----------------------------------------|" i1 e# u8 V4 I0 b- y, m" N
| | | | 0 | n n n n n n n |
7 A, W* P" ~8 s/ s! W9 e| | | --------------------------------------------------+ s8 y# ~3 t3 N, [( D
| | |
: W0 v9 d. g" T; N: F8 W| | | ; n& b% D( t( H& l! `! \+ F
| | | 对于 run length 数据包,头信息之后是一个简单颜色值,
2 y* V3 {4 E$ i+ \# n| | | 且假定该值重复的次数为头信息中记录的数
" E4 a' [3 w4 u/ W8 B| | | run-length 数据包也许会跨越扫描线
/ g) g) a5 k' I, W" J% Y' i7 ~/ j| | | (扫描线起始于某行结束于下一行)" k/ u5 M$ d: H
| | |
5 h3 u1 {$ a9 ]5 {| | | 对于未加工数据包,头信息之后是颜色值(数目由头信息指出)
0 X8 E: ~2 s! M| | | $ S, c/ v5 ^- {; z
| | | & C$ Y: \' H1 h5 Y7 p& o
| | | 颜色表项自身有 2-字节,3-字节或 4-字节几种大小(分别" D, V8 h7 ~! B' R$ o
| | | 对应 TGA 16,TGA 24 和 TGA 32)形式如下:9 X) `* E. j# I$ {
| | |
# `/ X2 A* s( I5 Q" a# z- u| | | @, K1 B7 D3 b! |5 r3 U
| | | 3 字节表项中各字节依次对应 BLUE,GREEN,RED
6 @& q: T: | Q5 }; Z/ G| | |
2 e" Q* F( ^& ?; u| | | 2 字节表项中,两个字节分解成如下形式:
7 F: z6 K# Q9 k! Q9 S% o# i| | | arrrrrgg gggbbbbb / d: e/ T: d; k0 N
| | | 但是,由于低位在前,高位在后的存储顺序,从文件中读出表项
0 n3 o' w" [5 T2 l| | | 时,将先读入 gggbbbbb 而后读入 arrrrrgg ;a 表示属性位
& Y5 q! {. z! K, c$ x$ I1 d| | | % g0 _7 R! J" Q9 Y5 {9 W4 |: w* ^
| | | 4 字节表项包含了分别代表 blue,green,red 及属性的四个. R' C0 o- X. P7 t( M) D7 `6 [
| | | 字节;(由于硬件上的原因)有的时候 TGA 24 类型的图像也象( ]; Z$ r' E0 }
| | | TGA 32 类型的图像那样存储
4 b- e& m! @& @2 z v| | | ; o+ {0 s1 e! c& c, w
--------------------------------------------------------------------------------
' q4 c. m2 |; D1 o+ |$ ^6 |* v: {0 w" b. Z8 j
<完> |