home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC Action 1997 October
/
PCA1097A.ISO
/
menue
/
postfach
/
97100233.txt
< prev
next >
Wrap
Text File
|
1997-08-28
|
9KB
|
360 lines
0
Grafik und Sound
Black Baron
Johnny Mnemonic
Datum: 22.07.1997
Betreff: lesen und schreiben eigener
Grafikformate (8/97)
From: Black Baron
To: Johnny Mnemonic
================================================
Das Programm PCX ist zum lesen von PCX Datein
mit 16 Farben und einer Größe von 680x480
Pixeln. Dieses Programm kann die PCX Datein nur
lesen nicht schreiben.
Program PCX;
Uses Graph;
Var B : Array [ 1 .. 480 , 1 .. 80 ] of Byte
absolute $A000 : $0000;
A , D , Q : Byte;
C , I , L , T , X , Y , Z : Longint;
G , H : Integer;
O : Array [ 1 .. 640 ] of Byte;
V : Array [ 1 .. 340 ] of Byte;
Procedure S ( N : Byte );
Begin
Port [ 964 ] := 2;
Case N of
0 : Port [ 985 ] := 1;
1 : Port [ 985 ] := 2;
2 : Port [ 985 ] := 4;
3 : Port [ 985 ] := 8;
4 : Port [ 985 ] := 16;
End;
End;
Var GD , GM : Integer;
DATEI : File;
DATEI_NAME : String;
Begin
Write ( 'Dateiname: ' );
Readln ( DATEI_NAME );
Detectgraph ( GD , GM );
Initgraph ( GD , GM , 'C:\TP\BGI' );
Assign ( DATEI , DATEI_NAME );
Reset ( DATEI , 1 );
Seek ( DATEI , 16 );
Blockread ( DATEI , V , 54 );
If V [ 54 ] = 0 Then Begin;
Y := 1;
For H := 0 to 15 do Begin
Setpalette ( H , H );
Setrgbpalette ( H , V [ Y ] Div 4 ,
V [ Y + 1 ] Div 4 ,
V [ Y + 2 ] Div 4 );
Y := Y + 3;
End;
End;
L := 128;
For G := 1 to 480 do Begin
I := 1;
T := 1;
Seek ( DATEI , L );
X := Filesize ( DATEI );
If ( L + 640 ) > X Then C := X - L
Else C := 640;
Blockread ( DATEI , O [ 1 ] , C );
Repeat
D := O [ T ];
T := T + 1;
L := L + 1;
If D and 192 = 192 Then Begin
A := D And 63;
D := O [ T ];
T := T + 1;
L := L + 1;
For Z := 1 to A do Begin
V [ I ] := D;
I := I + 1;
End;
End
Else Begin
V [ I ] := D;
I := I + 1;
End;
Until I = 321;
I := 1;
For Q := 0 to 3 do Begin
S ( Q );
For Y := 1 to 80 do Begin
B [ G , Y ] := V [ I ];
I := I + 1;
End;
End;
End;
Close ( DATEI );
S ( 4 );
Readln;
Closegraph;
End.
Die folgenden 2 Proceduren dienen zum lesen und
schreiben von Ausschnitten. Da diese Proceduren
auf den Put/Getimage Proceduren beruhen liegen
die Beschränkungen in der Größe der Ausschnitte
im Wesen dieser Proceduren und in Größe des noch
freien Heaps.
Anmerkung: Der Vorteil dieser Routinen ligt in
der Einfachheit und darin, daß sie bei allen
(fast allen) Graphikmodi funktioniern.
Herkules, CGA, EGA, VGA oder SVGA, es ist egal
Hauptsache man hat die Graphikfunktionen von
Pascal mit Initgraph aktiviert.
Procedure SAVE_AUSSCHNIT ( X1 , Y1 , X2 , Y2 :
Integer ; DATEI_NAME : String );
Var SIZE , OK : Word;
DATEI : File;
PUFFER : Pointer;
Begin
SIZE := Imagesize ( X1 , Y1 , X2 , Y2 );
Assign ( DATEI , DATEI_NAME );
Rewrite ( DATEI , 1 );
Getmem ( PUFFER , SIZE );
Getimage ( X1 , Y1 , X2 , Y2 , PUFFER^ );
{$I-}
Blockwrite ( DATEI , PUFFER^ , SIZE , OK );
{$I+}
If Ioresult <> 0 Then Exit;
Close ( DATEI );
Freemem ( PUFFER , SIZE );
End;
Procedure LOAD_AUSSCHNIT ( X , Y : Integer ;
DATEI_NAME : String );
Var DATEI : File;
B , H : Integer;
PIC : Pointer;
SIZE : Word;
Begin
Assign ( DATEI , DATEI_NAME );
{$I-}
Reset ( DATEI , 1 );
If Ioresult <> 0 Then Exit;
Blockread ( DATEI , B , 2 );
If Ioresult <> 0 Then Exit;
Blockread ( DATEI , H , 2 );
If Ioresult <> 0 Then Exit;
SIZE := Imagesize ( 0 , 0 , B , H );
Getmem ( PIC , SIZE );
Seek ( DATEI , 0 );
Blockread ( DATEI , PIC^ , SIZE );
{$I+}
If Ioresult <> 0 Then Exit;
Close ( DATEI );
Putimage( X , Y , PIC^ , NormalPut );
Freemem ( PIC , SIZE );
End;
Die letzten 2 Routinen funktionieren bei einer
Auflösung von 640x480 Pixeln und 256 Farben.
Die Graphikfunktionen von TP müßen über
Initgraph und die entsprechenden Treiber
initialisiert worden sein. Es wird immer der
ganze Bildschirm abgespeichert bzw. geladen,
da das ganze unkomprimiert ist, werden die
Datein 307200 Byte groß.
Die "Putpixel Aktionen" sind dazu da, auf die
entsprechende Graphikplan umzuschalten, ohne
dabei irgendwelchen Assamblercode zu verwenden.
Übergeben wird immer der Dateiname und zurück
kommt der Ioresult Fehlercode.
Uses Graph;
Function LOADSCREEN_256 ( NAME : String ) : Intege
Var DATEI : File;
DATEI_INHALT : Pointer;
PIXEL : Array [ 1 .. 5 ] of Byte;
F : Integer;
Begin
Assign ( DATEI , NAME );
{$I-}
Reset ( DATEI , 1 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
{$I-}
Blockread ( DATEI , PIXEL , 5 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
DATEI_INHALT := Ptr ( $A000 , 1 );
Putpixel ( 0 , 0 , PIXEL [ 1 ] );
{$I-}
Blockread ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
Putpixel ( 256 , 102 , PIXEL [ 2 ] );
{$I-}
Blockread ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
Putpixel ( 512 , 204 , PIXEL [ 3 ] );
{$I-}
Blockread ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
Putpixel ( 128 , 307 , PIXEL [ 4 ] );
{$I-}
Blockread ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
Putpixel ( 384 , 409 , PIXEL [ 5 ] );
{$I-}
Blockread ( DATEI , DATEI_INHALT^ , 45056 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
LOADSCREEN_256 := F;
Exit;
End;
Close ( DATEI );
LOADSCREEN_256 := 0;
End;
Function SAVESCREEN_256 ( NAME : String ) : Intege
Var DATEI : File;
DATEI_INHALT : Pointer;
PIXEL : Array [ 1 .. 5 ] of Byte;
F : Integer;
Begin
Assign ( DATEI , NAME );
{$I-}
Rewrite ( DATEI , 1 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
{$I-}
Blockwrite ( DATEI , PIXEL , 5 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
DATEI_INHALT := Ptr ( $A000 , 1 );
PIXEL [ 1 ] := Getpixel ( 0 , 0 );
{$I-}
Blockwrite ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
PIXEL [ 2 ] := Getpixel ( 256 , 102 );
{$I-}
Blockwrite ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
PIXEL [ 3 ] := Getpixel ( 512 , 204 );
{$I-}
Blockwrite ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
PIXEL [ 4 ] := Getpixel ( 128 , 307 );
{$I-}
Blockwrite ( DATEI , DATEI_INHALT^ , 65535 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
PIXEL [ 5 ] := Getpixel ( 384 , 409 );
{$I-}
Blockwrite ( DATEI , DATEI_INHALT^ , 45056 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
{$I-}
Seek ( DATEI , 0 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
{$I-}
Blockwrite ( DATEI , PIXEL , 5 );
F := Ioresult;
{$I+}
If F <> 0 Then Begin
SAVESCREEN_256 := F;
Exit;
End;
Close ( DATEI );
SAVESCREEN_256 := 0;
End;
Die Routine ist für ein reines Pascal Progamm
relativ zügig, könnte aber noch dadurch
beschleunigt werden, daß die Datein durch
Rewrite bzw. Reset nicht mit einer Recsize-
Größe von 1 sondern eben Größer geöffnet werden.
(Der Begriff Recsize kommt aus der TP Hilfe.)
Ich hoffe Dir etwas weitergeholfen zu haben. Auf
meiner Festplatte gibt es noch mehr solcher
Routinen die sich mit diesem Thema befassen,
aber alle in diese Mail zuschreiben halte ich
für sinnlos, da ich nicht weiß was Du genau
brauchst.
================================================
BRBE 07-17-00000000-97
║█▐│║▌█││▐║▌▐│ │▌▌║│║
║█▐│║▌█││▐║▌▐│ │▌▌║│║
9║783443234║131723472║
Peace
Black Baron
.
.