home *** CD-ROM | disk | FTP | other *** search
- unit Aus_TIFF;
- (* Gibt die PCL-Grafikdaten als TIFF-Datei aus *)
-
- interface
-
- const MaxBuff = 16000;
- type BufferTyp = array[1..MaxBuff] of byte;
- var GrafikModus : boolean;
-
- function B_to_Str(B_Param : boolean) : string;
- (* Hilfsfunktion für Fehlermeldungen etc. *)
-
- function R_to_Str(R_Param : real) : string;
- (* Hilfsfunktion für Fehlermeldungen etc. *)
-
- procedure Fehler(Meldung,Kennung: string);
- (* Gibt Fehlermeldungen aus *)
-
- procedure AusgabeInit(Breite,Hoehe : integer; (* In Pixeln *)
- DateiName : string;
- Aufloesung : integer; (* 1 für 300 DPI *)
- Verkleinern : integer); (* 1,2,4,8 *)
- (* Schreibt den Tiff_Header etc. *)
-
- procedure AusgabeExit;
- (* Schaltet wieder auf Text um *)
-
- procedure AusgabeDaten(Daten : BufferTyp;
- Anzahl : integer;
- X_Pos : integer;
- Y_Pos : integer);
- (* Gibt eine Pixelzeile aus *)
-
-
- implementation
-
- uses Dos, Crt;
-
- const MaxByte = 1000;
- MS_Dos = $21;
- type TIFF_Feld = array[0..MaxByte] of byte;
-
- var TIFF_Handle : word;
- TIFF_Buff : TIFF_Feld;
- Kehrwert : real;
- Len_Header : LongInt;
- Len_Zeile : word;
- Max_Breite : word;
- Max_Hoehe : word;
- Mass_Faktor : byte;
- Scr_Y : byte;
-
- function B_to_Str(B_Param : boolean) : string;
- begin
- if B_Param then B_to_Str := 'TRUE'
- else B_to_Str := 'FALSE';
- end;
-
- function R_to_Str(R_Param : real) : string;
- var R_Str : string;
- begin
- if R_Param = int(R_Param) then str(R_Param:1:0,R_Str)
- else str(R_Param:1:3,R_Str);
- R_to_Str := R_Str;
- end;
-
- procedure Fehler(Meldung,Kennung: string);
- begin
- writeln;
- writeln('Fehler ',Meldung,': <',Kennung,'> [CR]');
- readln;
- end;
-
- procedure CreateHandle(var Handle : word;
- DatNam : string);
- var FileNam : Dos.PathStr;
- Reg_I : Dos.Registers;
- begin
- FileNam := DatNam + #0;
- Reg_I.AH := $3C;
- Reg_I.CX := 0;
- Reg_I.DS := Seg(FileNam[1]);;
- Reg_I.DX := Ofs(FileNam[1]);
- Dos.Intr(MS_Dos,Reg_I); (* Create Handle *)
- Handle := 255;
- if odd(Reg_I.Flags) then Fehler('Create ',R_to_Str(Reg_I.AX))
- else Handle := Reg_I.AX;
- end;
-
- procedure CloseHandle(Handle : word);
- var Reg_I : Dos.Registers;
- begin
- Reg_I.AH := $3E;
- Reg_I.BX := Handle;
- Dos.Intr(MS_Dos,Reg_I); (* close Handle *)
- if odd(Reg_I.Flags) then Fehler('Close ',R_to_Str(Reg_I.AX));
- end;
-
- procedure ReadBytes(Handle : word;
- var Puffer;
- var Anzahl : word);
- var Reg_I : Dos.Registers;
- begin
- Reg_I.AH := $3F;
- Reg_I.BX := Handle;
- Reg_I.CX := Anzahl;
- Reg_I.DS := Seg(Puffer);
- Reg_I.DX := Ofs(Puffer);
- Dos.Intr(MS_Dos,Reg_I); (* Vom Handle in den Buffer lesen *)
- if odd(Reg_I.Flags) then
- begin
- Anzahl := 0;
- Fehler('ReadBytes ',R_to_Str(Reg_I.AX));
- end
- else Anzahl := Reg_I.AX;
- end;
-
- procedure WriteBytes(Handle : word;
- var Puffer;
- Anzahl : word);
- var Reg_I : Dos.Registers;
- begin
- Reg_I.AH := $40;
- Reg_I.BX := Handle;
- Reg_I.CX := Anzahl;
- Reg_I.DS := Seg(Puffer);
- Reg_I.DX := Ofs(Puffer);
- Dos.Intr(MS_Dos,Reg_I); (* Buffer in Handle schreiben *)
- if odd(Reg_I.Flags) then Fehler('Write ',R_to_Str(Reg_I.AX));
- end;
-
- procedure SeekLine(Handle : word;
- Zeile_I : integer);
- var Reg_I : Dos.Registers;
- F_Pos : LongInt;
- begin
- F_Pos := Len_Header + (Len_Zeile * Zeile_I);
- Reg_I.AH := $42;
- Reg_I.AL := 0;
- Reg_I.BX := Handle;
- Reg_I.CX := F_Pos div 65536;
- Reg_I.DX := F_Pos mod 65536;;
- Dos.Intr(MS_Dos,Reg_I); (* Setzt Pointer auf Anfang + F_Pos *)
- end;
-
- procedure AusgabeInit(Breite,Hoehe : integer;
- DateiName : string;
- Aufloesung : integer;
- Verkleinern : integer);
- var Lauf : integer;
- B_Breite : integer;
- B_Hoehe : integer;
-
- procedure WriteHeader(Breite,Hoehe,DPI : integer);
- (* Gibt den Dateiheader der TIFF-Datei aus und füllt die Datei *)
- const Short_Format : word = 3;
- Long_Format : word = 4;
- Bruch_Format : word = 5;
- Einheit_Zoll : word = 2;
- Breite_TAG : word = $0100;
- Laenge_TAG : word = $0101;
- Muster_TAG : word = $0102;
- Kompress_TAG : word = $0103;
- Inverse_TAG : word = $0106;
- Streifen_TAG : word = $0111;
- Zeilen_TAG : word = $0116;
- X_Res_TAG : word = $011A;
- Y_Res_TAG : word = $011B;
- Einheit_TAG : word = $0128;
-
- var Header : array [0..255] of byte;
- HeadPos : word;
- B_Wert : byte;
- Lauf_I : integer;
- Lauf_J : integer;
-
- procedure SetzeInt(I : integer);
- begin
- Header[HeadPos] := lo(I);
- inc(HeadPos);
- Header[HeadPos] := hi(I);
- inc(HeadPos);
- end;
-
- procedure SetzeLong(L : LongInt);
- var WFeld : array[1..2] of word absolute L;
- begin
- Header[HeadPos] := lo(WFeld[1]);
- inc(HeadPos);
- Header[HeadPos] := hi(WFeld[1]);
- inc(HeadPos);
- Header[HeadPos] := lo(WFeld[2]);
- inc(HeadPos);
- Header[HeadPos] := hi(WFeld[2]);
- inc(HeadPos);
- end;
-
- begin (* WriteHeader *)
- HeadPos := 0;
- FillChar(Header,SizeOf(Header),0);
- SetzeInt($4949); (* HEADER Intel Format *)
- SetzeInt($002a); (* Version *)
- SetzeLong($00000008); (* Pointer to first IFD *)
- SetzeInt(9); (* Anzahl der entry count IFD *)
-
- SetzeInt(Breite_TAG); (* 1 - Bildbreite in Pixeln *)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(Breite);
- SetzeInt(0);
-
- SetzeInt(Laenge_TAG); (* 2 - Bildlänge in Pixeln*)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(Hoehe);
- SetzeInt(0);
-
- SetzeInt(Muster_TAG); (* Bits pro Muster*)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(1);
- SetzeInt(0);
-
- SetzeInt(Inverse_TAG); (* Invertieren ? *)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(0);
- SetzeInt(0);
-
- SetzeInt(Streifen_TAG); (* 5 - Anzahl Streifen *)
- SetzeInt(Long_Format);
- SetzeLong(1);
- SetzeLong($0000008A); (* Zeiger auf folgenden Daten *)
-
- SetzeInt(Zeilen_TAG); (* 6 Zeilen pro Streifen *)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(Hoehe);
- SetzeInt(0);
-
- SetzeInt(X_Res_TAG); (* 7 - X-Auflösung *)
- SetzeInt(Bruch_Format);
- SetzeLong(1);
- SetzeLong($0000007A); (* Zeiger auf X-Bruch *)
-
- SetzeInt(Y_Res_TAG); (* 8 - Y-Auflösung*)
- SetzeInt(Bruch_Format);
- SetzeLong(1);
- SetzeLong($00000082); (* Zeiger auf Y-Bruch *)
-
- SetzeInt(Einheit_TAG); (* 9 - Maßeinheit setzen *)
- SetzeInt(Short_Format);
- SetzeLong(1);
- SetzeInt(Einheit_Zoll); (* Maße in Zoll *)
- SetzeInt(0);
-
- SetzeLong(0); (* Verweis auf nächsten IFD *)
- SetzeLong(1); (* Bruch X_Resolution, Zähler *)
- SetzeLong(DPI); (* Nenner *)
- SetzeLong(1); (* Bruch Y-Resolution, Zähler *)
- SetzeLong(DPI); (* Nenner *)
- dec(HeadPos);
- Len_Header := HeadPos;
- WriteBytes(TIFF_Handle,Header,HeadPos);
- (* Jetzt folgen die Graphik-Daten ... *)
- FillChar(TIFF_Buff,SizeOf(Tiff_Buff),0);
- for Lauf_I := 1 to Hoehe do
- begin
- WriteBytes(TIFF_Handle,TIFF_Buff,Len_Zeile);
- GotoXY(1,Scr_Y); write(100.0 * Lauf_I /Hoehe :6:1);
- end;
- end;
-
- begin (* AusgabeInit *)
- for Lauf := 1 to length(DateiName)
- do DateiName[Lauf] := upcase(DateiName[Lauf]);
- if pos('.',DateiName) > 0
- then DateiName := copy(DateiName,1,pred(pos('.',DateiName)));
- DateiName := DateiName + '.TIF';
- writeln('TIFF-Datei "',DateiName,'" wird angelegt ... ');
- Kehrwert := 1.0 / (1.0 * Aufloesung);
- case Verkleinern of
- 2 : Mass_Faktor := 2;
- 4 : Mass_Faktor := 4;
- 8 : Mass_Faktor := 8;
- else Mass_Faktor := 1;
- end;
- KehrWert := KehrWert / (1.0 * Mass_Faktor);
- B_Breite := round(Kehrwert * Breite);
- B_Hoehe := round(Kehrwert * Hoehe);
- Len_Zeile := B_Breite div 8;
- if B_Breite mod 8 > 0 then inc(Len_Zeile);
- writeln('benötigt etwa ',(Len_Zeile * B_Hoehe) div 1024,
- ' Kilobyte Platz.');
- writeln(0.0 :6:1,' % Initialisierung');
- Scr_Y := pred(WhereY);
- Max_Breite := B_Breite;
- Max_Hoehe := B_Hoehe;
- CreateHandle(TIFF_Handle,DateiName);
- WriteHeader(B_Breite,B_Hoehe,300 div Aufloesung);
- GotoXY(1,Scr_Y);
- writeln('Initialisierung beendet, Umwandlung beginnt ...');
- writeln('etwa ',0.0 :6:1,' % Umwandlung');
- Scr_Y := pred(WhereY);
- end;
-
- procedure AusgabeDaten(Daten : BufferTyp;
- Anzahl : integer;
- X_Pos : integer;
- Y_Pos : integer);
- var Pixel_X : integer;
- Pixel_Y : integer;
- DatenB : byte;
- Weiter : byte;
- Lauf : integer;
-
- procedure SetzeByte(B : byte; X : integer);
- (* Überlagert die Pixelzeile mit dem Byte-Muster B *)
- var Index : integer;
- Rest : integer;
- Wert : integer;
- begin
- Index := X div 8;
- Rest := X mod 8;
- if Rest = 0
- then TIFF_Buff[Index] := TIFF_Buff[Index] or B
- else
- begin
- Wert := B shr (8 - Rest);
- TIFF_Buff[Index] := TIFF_Buff[Index] or lo(Wert);
- inc(Index);
- Wert := B shl Rest;
- TIFF_Buff[Index] := TIFF_Buff[Index] or lo(Wert);
- end;
- end;
-
- begin
- Pixel_X := round(Kehrwert * X_Pos);
- Pixel_Y := round(Kehrwert * Y_Pos);
- GotoXY(6,Scr_Y); write(100.0 * Pixel_Y / Max_Hoehe :6:1);
- Weiter := 8 div Mass_Faktor;
- SeekLine(TIFF_Handle,Pixel_Y);
- ReadBytes(TIFF_Handle,TIFF_Buff,Len_Zeile);
- for Lauf := 1 to Anzahl do
- begin
- DatenB := Daten[Lauf];
- if DatenB <> 0 then SetzeByte(DatenB,Pixel_X);
- inc(Pixel_X,Weiter);
- end;
- SeekLine(TIFF_Handle,Pixel_Y);
- WriteBytes(TIFF_Handle,TIFF_Buff,Len_Zeile);
- end;
-
- procedure AusgabeExit;
- begin
- CloseHandle(TIFF_Handle);
- GotoXY(1,Scr_Y);
- writeln('Umwandlung beendet, TIFF-Datei erzeugt.');
- writeln;
- end;
-
- end.
-
- @bu = In dieser Unit wird die TIFF-Datei erzeugt