Как вывести графический файлик PCX на экран?
Очень срочно надо, а то что видел почему-то не работает :-(
class {
char Manufacturer; // Постоянный флаг 10 = ZSoft .PCX
char Version; // 0 = Версия 2.5
// 2 = Версия 2.8 с информацией о палитре
// 3 = Версия 2.8 без информации о палитре
// 5 = Версия 3.0
char Encoding; // 1 = .PCX кодирование длинными сериями
char BitsPerLayer; // Число бит на пиксел в слое
unsigned int Xmin; // Размеры изображения
unsigned int Ymin; // Размеры изображения
unsigned int Xmax; // Размеры изображения
unsigned int Ymax; // Размеры изображения
unsigned int HRes; // Горизонтальное разрешение создающего устройства
unsigned int VRes; // Вертикальное разрешение создающего устройства
char Colormap[48]; // Набор цветовой палитры (см. далее текст)
char Reserved;
char NPlanes; // Число цветовых слоев
unsigned int BPL; // Число байт на строку в цветовом слое
// (для PCX-файлов всегда должно быть четным)
unsigned int Palette; // Как интерпретировать палитру:
// 1 = цветная/черно-белая,
// 2 = градации серого
char Filler[58]; // Заполняется нулями до конца заголовка
}
program z1;
type
RGB = record
Red,
Green,
Blue : Byte;
end;
header=record
Maker : Byte;
Version : Byte;
Code : Byte;
BitsPerPixel : Byte;
XLow : Word;
YLow : Word;
XHigh : Word;
YHigh : Word;
Hres : Word;
Vres : Word;
Palette : array [0..15] of RGB;
VMode : Byte;
PlaneCount : Byte;
BytesPerLine : Word;
Reserved : array [0..59] of byte;
end;
var pcx:header;
f:file;
begin
assign(f,'file.pcx');
reset(f);
blockread(f, pcx, 128);
close(f);
write(pcx.Hres);
end.
reset(f,1);
ColorMap : array[0..47] of byte;{палитра для 16ц режимов}
program z1;
uses crt, graph;
type
Tarray64k=array[0..65534] of byte;
RGB = record
Red,
Green,
Blue: Byte;
end;
header=record
Maker : Byte;
Version : Byte;
Code : Byte;
BitsPerPixel : Byte;
XLow : Word;
YLow : Word;
XHigh : Word;
YHigh : Word;
Hres : Word;
Vres : Word;
Palette : array [0..15] of RGB;
VMode : Byte;
PlaneCount : Byte;
BytesPerLine : Word;
Reserved : array [0..59] of byte;
end;
var pcx:header;
f:file;
gd,gm,i,j:integer;
x,y:word;
buf:^Tarray64k;
fsize:longint;
c:byte;
res:word;
count:longint;
m:longint;
ex,ey:word;
l:word;
adress:string;
begin readln(adress);
assign(f,adress);
reset(f,1);
blockread(f, pcx, 128);
gd:=detect;
InitGraph(gd, gm, '');
fsize:=filesize(f);
with pcx.palette[i] do setRGBpalette(i,red,green,blue);
{попытка объявления палитры}
seek(f,128);
InitGraph(gd, gm, '');
getmem(buf,65535);
gd:=detect;
x:=0; y:=0; c:=0; count:=0;
for i:= 1 to (fsize div 65535)+1 do
begin
blockread(f,buf^,65535,res);
ey:=pcx.yhigh-pcx.ylow+1;
ex:=pcx.xhigh-pcx.xlow+1;
m:=0;
while (m<res) and (y<ey) do
begin
if c<>0
then
begin
for l:=1 to c do
begin
PutPixel(x,y,buf^[m]);
inc(x);
end;
inc(count,c);
c:=0;
end
else
if (buf^[m] and $c0=$c0)
then
c:=buf^[m] and $3f else
begin
PutPixel(x,y,buf^[m]);
Inc( X );
inc(count,1);
end;
inc (m);
IF X >= eX THEN
BEGIN
x:=0;
Inc( Y )
END
end;
end;
freemem(buf,65535);
close(f);
repeat;
until keypressed;
CloseGraph;
end.
program kurswork;
uses crt, graph;
type
Tarray64k=array[0..65534] of byte;
RGB = record
Red,
Green,
Blue: Byte;
end;
header=record
Maker : Byte;
Version : Byte;
Code : Byte;
BitsPerPixel : Byte;
XLow : Word;
YLow : Word;
XHigh : Word;
YHigh : Word;
Hres : Word;
Vres : Word;
Palette : array [0..15] of RGB;
VMode : Byte;
PlaneCount : Byte;
BytesPerLine : Word;
Reserved : array [0..59] of byte;
end;
var Palette : array[0..255] of RGB;
pcx : header;
f : file;
gd,gm,i,j : integer;
x,y : word;
buf : ^Tarray64k;
fsize : longint;
c : byte;
res : word;
count : longint;
m : longint;
ex,ey : word;
l : word;
adress : string;
begin readln(adress);
assign(f,adress);
reset(f,1);
blockread(f, pcx, 128);
gd:= InstallUserDriver('SVGA256',@gd); gm:= 9;
InitGraph(gd, gm, '');
fsize:=filesize(f);
Seek(f, fsize-768);
for i:=0 to 255 do
begin
BlockRead(f, Palette[i].red, 1);
Palette[i].red:=Palette[i].red shr 2;
BlockRead(f, Palette[i].green, 1);
Palette[i].green:=Palette[i].green shr 2;
BlockRead(f, Palette[i].blue, 1);
Palette[i].blue:=Palette[i].blue shr 2;
end;
for i:=0 to 255 do
begin
port[$3C6]:= $FF;
port[$3C8]:= i;
port[$3C9]:= Palette[i].red;
port[$3C9]:= Palette[i].green;
port[$3C9]:= Palette[i].blue;
end;
seek(f,128);
getmem(buf,65535);
x:=0; y:=0; c:=0; count:=0;
for i:= 1 to (fsize div 65535)+1 do
begin
blockread(f,buf^,65535,res);
ey:=pcx.yhigh-pcx.ylow+1;
ex:=pcx.xhigh-pcx.xlow+1;
m:=0;
while (m<res) and (y<ey) do
begin
if c<>0
then
begin
for l:=1 to c do
begin
PutPixel(x,y,buf^[m]);
inc(x);
end;
inc(count,c);
c:=0;
end
else
if (buf^[m] and $c0=$c0)
then
c:=buf^[m] and $3f else
begin
PutPixel(x,y,buf^[m]);
Inc( X );
inc(count,1);
end;
inc (m);
IF X >= eX THEN
BEGIN
x:=0;
Inc( Y )
END
end;
end;
freemem(buf,65535);
close(f);
repeat;
until keypressed;
CloseGraph;
end.