File ảnh PCX
Nếu ta hình dung trong một tệp ảnh xếp liên tiếp các byte từ đầu đến cuối và dồn chúng vào trong một hộp chữ nhật, thì có thể hình dung tệp ảnh PCX như hình vẽ sau:
Hình 1. Cấu trúc file ảnh PCX
I. Data of Image
1. ảnh 24 bit
ã Mỗi điểm ảnh chiếm 3 byte mô tả ba thành phần: Red, Green, Blue.
2. ảnh 256 màu
ã Dữ liệu mỗi điểm ảnh chiếm 1 byte, chỉ số hiệu màu của điểm ảnh này. Màu của điểm ảnh được mô tả trong bảng màu. Giả sử byte mô tả điểm ảnh có giá trị là b, bảng màu được chứa trong mảng P, thì thành phần các màu của điểm ảnh này là P[b].R, P[b].G, P[b].B.
ã Dữ liệu được nén theo thuật toán RUN_LENGTH với 2 bit cao làm cờ
3. ảnh 16 màu
ã Mỗi điểm ảnh được mô tả bởi một con số, có giá trị từ 0 đến 15. Do vậy, giá trị mỗi điểm ảnh chỉ cần 4 bit để mô tả.
ã Dữ liệu ảnh được mã hoá theo mặt phẳng bit, sau đó nén theo thuật toán RUN-LENGTH với 2 bit cao làm cờ.
4 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2311 | Lượt tải: 1
Bạn đang xem nội dung tài liệu File ảnh PCX, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
File ¶nh PCX
NÕu ta h×nh dung trong mét tÖp ¶nh xÕp liªn tiÕp c¸c byte tõ ®Çu ®Õn cuèi vµ dån chóng vµo trong mét hép ch÷ nhËt, th× cã thÓ h×nh dung tÖp ¶nh PCX nh h×nh vÏ sau:
H×nh 1. CÊu tróc file ¶nh PCX
Data of Image
¶nh 24 bit
Mçi ®iÓm ¶nh chiÕm 3 byte m« t¶ ba thµnh phÇn: Red, Green, Blue.
¶nh 256 mµu
D÷ liÖu mçi ®iÓm ¶nh chiÕm 1 byte, chØ sè hiÖu mµu cña ®iÓm ¶nh nµy. Mµu cña ®iÓm ¶nh ®îc m« t¶ trong b¶ng mµu. Gi¶ sö byte m« t¶ ®iÓm ¶nh cã gi¸ trÞ lµ b, b¶ng mµu ®îc chøa trong m¶ng P, th× thµnh phÇn c¸c mµu cña ®iÓm ¶nh nµy lµ P[b].R, P[b].G, P[b].B.
D÷ liÖu ®îc nÐn theo thuËt to¸n RUN_LENGTH víi 2 bit cao lµm cê
¶nh 16 mµu
Mçi ®iÓm ¶nh ®îc m« t¶ bëi mét con sè, cã gi¸ trÞ tõ 0 ®Õn 15. Do vËy, gi¸ trÞ mçi ®iÓm ¶nh chØ cÇn 4 bit ®Ó m« t¶.
D÷ liÖu ¶nh ®îc m· ho¸ theo mÆt ph¼ng bit, sau ®ã nÐn theo thuËt to¸n RUN-LENGTH víi 2 bit cao lµm cê.
Color Palette (B¶ng mµu)
¶nh 24 bit: TÖp ¶nh kh«ng cã b¶ng mµu
¶nh 256 mµu
B¶ng mµu chiÕm 256*3=768 byte, ®îc ®Æt ë cuèi tÖp
Mçi mµu ®îc m« t¶ bëi 3 byte, thÓ hiÖn c¸c thµnh phÇn: RED, GREEN vµ BLUE.
Gi¸ trÞ cña c¸c thµnh phÇn RED, GREEN vµ BLUE ®îc lu tr÷ ë 6 bit cao.
¶nh 16 mµu
B¶ng mµu chiÕm 16*3=48 byte
Mçi mµu ®îc m« t¶ bëi 3 byte, thÓ hiÖn c¸c thµnh phÇn: RED, GREEN vµ BLUE.
Gi¸ trÞ cña c¸c thµnh phÇn BLUE, GREEN vµ RED ®îc lu tr÷ ë 6 bit cao.
Kh«ng phô thuéc vµo sè lîng mµu, 48 byte cña b¶ng 16 mµu lu«n cã mÆt trong phÇn Header.
III. Header
Header cña c¸c tÖp ¶nh PCX gåm 54 byte, ®îc m« t¶ chi tiÕt trong b¶ng sau:
File Header
Sè bytes
ý nghÜa
Néi dung
1
Sign
10
1
Version
1
Encode
1
BitsPerPixel
4
X1,Y1 above-left co-ordinates of image
4
X2,Y2 below-right co-ordinates of image
2
Horizontal Discrimination (meter)
2
Vertical Discrimination (meter)
48
Color Palette of 16 colors
1
Video Mode
1
Number of bit’s plane
2
Number of bytes per line (after encode bits planes)
60
Unused
IV. Ch¬ng tr×nh minh ho¹ ®äc ¶nh PCX 256 mµu
S¬ ®å
Ch¬ng tr×nh minh ho¹ chØ ®äc ¶nh 256 mµu.
Më tÖp ¶nh
§äc 128 byte Header; DataPos := FilePos(F);
Seeek(F,FileSize(F)-768); §äc 768 byte B¶ng mµu
Khëi t¹o chÕ ®é ®å ho¹
T¹o d÷ liÖu b¶ng mµu
N¹p b¶ng mµu
§äc vµ vÏ c¸c ®iÓm ¶nh:
Seek(F,DataPos);
Sè ®iÓm ¶nh trªn dßng := Sè mÆt ph¼ng bit * Sè byte trªn dßng;
For i:= Header.Y1 to Header.Y2
L:=0;
While L < Sè ®iÓm ¶nh trªn dßng Do
§äc d÷ liÖu vµo byte B nÕu cha hÕt tÖp;
If B >= 192 then
SLL := B- 192;
§äc tiÕp d÷ liÖu vµo byte B;
Else SLL:=1;
For i:=0 to SLL -1 do PL[SLL+i]:=B;
SLL = L + SLL;
For j:=Header.X1 to Header.X2 Vex(j, i, PL[j]);
§ãng tÖp ¶nh
2. Mét sè khai b¸o chÝnh
Header : Record
Sign,Version,Encode,BitPerPixel : Byte;
X1,Y1,X2,Y2, Hres,Vres : Integer;
Palette : Array [0..15,1..3] of Byte;
Vmode, Planes : Byte;
BytesPerLine : Integer;
Unused : Array [1..60] of Byte;
End;
Gi¶i nÐn theo RUN_LENGTH
Sè ®iÓm ¶nh trªn dßng := Sè mÆt ph¼ng bit * Sè byte trªn dßng;
L:=0;
While L < Sè ®iÓm ¶nh trªn dßng Do
§äc d÷ liÖu vµo byte B nÕu cha hÕt tÖp;
If B >= 192 then
SLL := B- 192;
§äc tiÕp d÷ liÖu vµo byte B;
Else SLL:=1;
For i:=1 to SLL do PL[L+i]:=B;
L = L + SLL;
Gi¶i m· BIT_PLANE:
If (Sè mÆt ph¼ng bit =1) Then PC:=PL
If Sè mÆt ph¼ng bit >1
For bit:=0 To Sè mÆt ph¼ng bit -1 Do
doan := bit*Sè byte trªn dßng;
For t:=0 to Sè byte trªn dßng-1 do
* B:=PL[doan+t];
* For i:=0 to 7 do
If (bit 7-i cña B lµ 1) Then PC[8*t+i]:= PC[8*t+i] + (2 mò i);
124,214,56,157,198,212,202,12
124, 56,56,...,56,157,212,...,212,12,12,...,12
x1, x2, x3, ..., xn
l1,d1,l2,d2,..., lk,dk
255,127
Các file đính kèm theo tài liệu này:
- File ảnh PCX.doc