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