Title: Viewing PCX File Format in Delphi (256-colors)
Question: How to show bitmap in pcx file format using Delphi ??
Answer:
This is quite simple way to answer above question: viewing pcx file format using Delphi. But this answer is limited only for 256-colors image (pcx image).
Here is the example code for the answer :
type
TArrBuff = Array [1..512] of Byte;
TPalette_Cell = Record
r, g, b : byte;
End;
TPal = Array [0..255] of TPalette_Cell;
TPPal = ^TPal;
TPCX_Header = Record // PCX Header
Manufacture, Version, Encoding, BpPixel : Byte;
XMin, YMin, XMax, YMax, Hdpi, Vdpi : Smallint;
ColorMap : Array [0..15, 0..2] of Byte;
Reserved, Nplanes : Byte;
BpLpPlane, PaletteInfo, HScreenSize, VScreenSize : Smallint;
Filer : Array [74..127] of Byte;
End;
var
pal: TPPal;
pFile: File;
FPcxHeader: TPCX_Header;
buffer: TArrBuff;
procedure THPPcx.ReadImageData2Bitmap;
var
X, Y: Integer;
i, Loop: Byte;
data: Word;
tmpClr: TColor;
begin
X := FPcxHeader.XMin;
Y := FPcxHeader.YMin;
data := 1;
BlockRead(pFile, Buffer, SizeOf(Buffer));
While (Y if (Buffer[data] and $C0) = $C0 then Begin
Loop := Buffer[data] and $3F;
if data else begin
data:= 1;
BlockRead(pFile, Buffer, SizeOf(Buffer));
end;
end else Loop:=1;
for i := 1 to Loop do begin
tmpClr := rgb(pal^[Buffer[data]].R, pal^[Buffer[data]].G, pal^[Buffer[data]].B);
SetPixel(Bitmap.Canvas.Handle, x, y, tmpClr);
Inc(X);
if X = FPcxHeader.BpLpPlane then begin
X := FPcxHeader.XMin;
Inc(Y);
end;
end;
if data else begin
data:= 1;
BlockRead(pFile, Buffer, SizeOf(Buffer));
end;
end;
end;
procedure THPPCX.LoadFromFile(const FileName : String);
begin
AssignFile(pFile, FileName);
{$I-} Reset(pFile, 1); {$I+}
if IOResult = 0 then begin
BlockRead(pFile, FPcxHeader, SizeOf(FPcxHeader));
if FPcxHeader.Manufacture=10 then begin // valid pcx header id
Bitmap.Width := FPcxHeader.XMax;
Bitmap.Height := FPcxHeader.YMax;
GetMem(pal, 768);
try
Seek(pFile, FileSize(pFile) - 768); // palette position
BlockRead(pFile, pal^, 768);
Seek(pFile, SizeOf(FPcxHeader)); // image data position
ReadImageData2Bitmap;
finally
FreeMem(pal);
end;
end
else
MessageBox(Application.Handle, 'Not A Valid PCX File Format', 'PCX Viewer Error', MB_ICONHAND);
CloseFile(pFile);
end
else MessageBox(Application.Handle, 'Error Opening File', 'PCX Viewer Error', MB_ICONHAND);
end;
How to try this code ?? Just call the "LoadFromFile" procedure above in your application (probably with little modification offcourse, especially about the name of mainForm that I used here [THPPCX]).
Hopefully It can help you.
For full source code and simple application that use this, you can look and download from my website: www.geocities.com/h4ryp/delphi.html.