Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.29;
Скачать: CL | DM;

Вниз

PCX - файлы...   Найти похожие ветки 

 
som   (2002-04-22 13:33) [0]

Мне нужно отображать (например в TImаge)РСХ-файлы. Как это сделать?


 
Donal_Graeme   (2002-04-22 18:28) [1]

procedure PCXtoBMP (Filename: String; var Bmp : TBitmap);
var MS : TMemoryStream;
I, J, K, N : Word;
Temp : Byte;
Pos : DWord;

//Fields
Manuf : byte; //Manufacturer
Ver : byte; //Version
Enc : byte; //Encoding
Bits : byte; //Bits per pixel
XMin,
XMax,
YMin,
YMax : Word; //Window
HDpi, VDpi : Word;
Colormap : Array [0..47] of Byte;
nPlanes : Byte;
BPL : Word; //Bites per line
GrayScale : Word;
HSize, //HScreenSize
VSize : Word; //VScreenSize

Palette : Array [0..255] of TColor;
Color : Array [1..3] of Byte;

SL : PByteArray;

//Work vars
HDim, VDim : Integer;
LineCap : Integer;
PalMode : Boolean;

HS : TMemoryStream;
begin
MS := TMemoryStream.Create;
MS.LoadFromFile (Filename);
With MS do
begin
try
Position := 0;
Read (Manuf, 1);
Read (Ver, 1);
Read (Enc, 1);
Read (Bits, 1);
Read (XMin, 2);
Read (YMin, 2);
Read (XMax, 2);
Read (YMax, 2);
Read (HDpi, 2);
Read (VDpi, 2);
Read (Colormap[0], 48);
Read (Temp, 1);
Read (nPlanes, 1);
Read (BPL, 2);
Read (GrayScale, 2);
Read (HSize, 2);
Read (VSize, 2);
For I := 1 to 54 do Read (Temp, 1);

If Ver > 5 then Exit;
If nPlanes > 4 then Exit;
//Decoding
HDim := XMax -XMin +1;
VDim := YMax -YMin +1;
LineCap := nPlanes*BPL;

PalMode := False;

If Ver = 5 then //Reading palette
begin
Pos := Position;
Position := Size -769;
Read (Temp, 1);
If Temp = 12 then
begin
PalMode := True;
For I := 0 to 255 do
begin
Read (Color[1], 3);
Palette[I] := RGB (Color[1], Color[2], Color[3]);
end;
end;
Position := Pos;
end;

HS := TMemoryStream.Create;
HS.Size := LineCap*VDim;
HS.Position := 0;

For J := 0 to VDim -1 do
begin
I := 0;
While I < LineCap do
begin
Read (Temp, 1);
If (Temp and $C0) = $C0 then
begin
N := (Temp and $3F);
Read (Temp, 1);
For K := 1 to N do
begin
HS.Write (Temp, 1);
Inc (I);
If I >= LineCap then Break;
end;
end
else
begin
HS.Write (Temp, 1);
Inc (I);
end;
end;
end;

//Writing Image
HS.Position := 0;
Bmp.Width := HDim;
Bmp.Height := VDim;
If PalMode then
begin
Bmp.PixelFormat := pf24bit;
For I := 0 to VDim -1 do
begin
SL := Bmp.ScanLine[I];
For J := 0 to LineCap -1 do
begin
HS.Read (Temp, 1);
If J < HDim then
begin
SL[J*3] := GetBValue (Palette[Temp]);
SL[J*3 +1] := GetGValue (Palette[Temp]);
SL[J*3 +2] := GetRValue (Palette[Temp]);
end;
end;
end;
end
else
begin
Case Bits of
1 : Bmp.PixelFormat := pf1bit;
4 : Bmp.PixelFormat := pf4bit;
else
Case nPlanes of
1 : Bmp.PixelFormat := pf8bit;
2 : Bmp.PixelFormat := pf16bit;
3 : Bmp.PixelFormat := pf24bit;
4 : Bmp.PixelFormat := pf32bit;
end;
end;
For I := 0 to VDim -1 do
begin
SL := Bmp.ScanLine[I];
For K := nPlanes -1 downto 0 do
begin
J := 0;
Repeat
HS.Read (Temp, 1);
SL[J*3 +K] := Temp;
Inc (J);
Until J >= LineCap div 3;
end;
end;
end;

HS.Free;
finally
Free;
end;
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.08.29;
Скачать: CL | DM;

Наверх




Память: 0.45 MB
Время: 0.006 c
1-95791
SetupOS
2002-08-19 21:21
2002.08.29
Как программно прокрутить RichEdit вверх, вниз…


14-95971
FLIZ
2002-07-30 16:44
2002.08.29
Кто достоин носить звание


4-96033
SeF
2002-06-27 02:46
2002.08.29
чужая прога


1-95801
Lord BDV
2002-08-16 20:16
2002.08.29
Выше 64 MB на Windows 98 не прыгнешь !?!


3-95683
Fad
2002-08-08 11:20
2002.08.29
Помогите!!! Ошибка в базе данных.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский