Cấu trúc file ảnh PCX Tài liệu Xử lý ảnh số
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: 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. Hình 1. Cấu trúc file ảnh PCX 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ờ. II. Color Palette (Bảng màu) 4. ảnh 24 bit: Tệp ảnh không có bảng màu 5. ả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. 6. ả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 bits 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 1. Sơ đồ Chơng trình minh hoạ chỉ đọc ảnh 256 màu. 1. Mở tệp ảnh 2. Đọc 128 byte Header; DataPos := FilePos(F); 3. Seeek(F,FileSize(F)-768); Đọc 768 byte Bảng màu 4. Khởi tạo chế độ đồ hoạ 5. Tạo dữ liệu bảng màu 6. Nạp bảng màu 7. Đọc và vẽ các điểm ảnh: a. Seek(F,DataPos); b.Số điểm ảnh trên dòng := Số mặt phẳng bit * Số byte trên dòng; c. For i:= Header.Y1 to Header.Y2 L:=0; While L < Số điểm ảnh trên dòng Do a) Đọc dữ liệu vào byte B nếu cha hết tệp; b) If B >= 192 then + SLL := B- 192; + Đọc tiếp dữ liệu vào byte B; Else SLL:=1; c) For i:=0 to SLL -1 do PL[SLL+i]:=B; d) SLL = L + SLL; For j:=Header.X1 to Header.X2 Vex(j, i, PL[j]); 8. Đó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 1.Số điểm ảnh trên dòng := Số mặt phẳng bit * Số byte trên dòng; 2.L:=0; 3.While L < Số điểm ảnh trên dòng Do a. Đọc dữ liệu vào byte B nếu cha hết tệp; b.If B >= 192 then + SLL := B- 192; + Đọc tiếp dữ liệu vào byte B; Else SLL:=1; c. For i:=1 to SLL do PL[L+i]:=B; d.L = L + SLL; Giải mã BIT_PLANE: 1. If (Số mặt phẳng bit =1) Then PC:=PL 2. 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 . Image 1. ảnh 24 bit Mỗi điểm ảnh chiếm 3 byte mô tả ba thành phần: Red, Green, Blue. Hình 1. Cấu trúc file ảnh PCX 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. 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: I Chơng trình minh hoạ đọc ảnh PCX 256 màu 1. Sơ đồ Chơng trình minh hoạ chỉ đọc ảnh 256 màu. 1. Mở tệp ảnh 2. Đọc 128 byte Header; DataPos := FilePos(F); 3. Seeek(F,FileSize(F)-768); Đọc 768