home *** CD-ROM | disk | FTP | other *** search
-
- UNIT TIFFUNIT;
- {
- Paul Schubert, Rottweiler Str. 8, 6000 Frankfurt 1, 069 / 231145
-
- DIESE UNIT STELLT DIE PROZEDUREN ZUR BEARBEITUNG VON TIFF- DATEIEN ZUR
- VERFÜGUNG
-
- 14.7.90
- IN DIESER VERSION SIND NOCH KEINE MÖGLICHKEITEN ZUM SCHREIBEN EINES TIFF-
- FILES ENTHALTEN.
- MEHR ALS 1 IFD ( BILD ) PRO FILE WIRD NOCH NICHT UNTERSTÜTZT.
-
-
- DANK AN TORSTEN PRIEBE, VON DEM ICH DIE TIFF- SPEZIFIKATION UND
- DIE LISTE DER TAG- NAMEN ERHALTEN HABE
-
- }
-
- INTERFACE
- {$F+}
-
-
- { TURBO PROFESSIONAL VERWENDEN - ANSONSTEN .$DEFINE SCHREIBEN }
- {$DEFINE TPROF}
- { UNIT BUFFILE VERWENDEN - ANSONSTEN .$DEFINE SCHREIBEN }
- {.$DEFINE FILEBUFFER }
-
- USES
- {$IFDEF TPROF}
- TPCRT,TPSTRING
- {$ELSE}
- CRT,TPERSATZ
- {$ENDIF}
- {$IFDEF FILEBUFFER }
- ,BUFFILE
- {$ENDIF}
- ,DOS,VIDEO;
-
-
- CONST IFDMAX = 100; { MAXIMALE ANZAHL EINTRÄGE IM IFD }
- STRIPMAX = 200; { MAXIMALE ANZAHL STRIPS }
- PLAINMAX = 3; { MAXIMALE ANZAHL PLANES }
-
-
- TYPE TIFFHDRTYP = RECORD
- O : WORD; { BYTEORDER 'II' = LOHI, 'MM' = HILO }
- ID : WORD; { MUß 42 SEIN ! }
- IFDP : LONGINT; { POINTER AUF 1. IFD }
- S : LONGINT; { FILESIZE - STEHT NICHT IM FILE }
- END;
-
- IFETYP = RECORD
- TA,TY : WORD; { TAG / TYP }
- L,V : LONGINT; { LÄNGE / VALUE ( POINTER ) }
- END;
-
- TIFFIFDTYP = RECORD
- N : WORD; { ANZAHL EINTRÄGE IM IFD }
- NX : LONGINT; { POINTER AUF NÄCHSTES IFD }
- I : ARRAY[1..IFDMAX] OF IFETYP;
- END;
-
- STRIPTYP = RECORD
- O,B : LONGINT;
- END;
-
- REALTYP = ARRAY[0..1] OF LONGINT;
-
-
- { Die Namen aller Tags }
- Const TagNames: Array[$FD..$140] Of String[20]= { 20 Zeichen }
- {I 0FD 253} ('TIFF Class ',
- {? 0FE 254} 'NewSubfileType ',
- {A 0FF 255} 'SubfileType ',
- {! 100 256} 'ImageWidth ',
- {! 101 257} 'ImageLength ',
- {! 102 258} 'BitsPerSample ',
- {! 103 259} 'Compression ',
- { 104 260} '? ',
- { 105 261} '? ',
- {! 106 262} 'PhotometricInterp. ',
- {A 107 263} 'Threshholding ',
- {A 108 264} 'CellWidth ',
- {A 109 265} 'CellLength ',
- {A 10A 266} 'FillOrder ',
- { 10B 267} '? ',
- { 10C 268} '? ',
- {I 10D 269} 'DocumentName ',
- {I 10E 270} 'ImageDescription ',
- {I 10F 271} 'Make ',
- {I 110 272} 'Model ',
- {! 111 273} 'StripOffsets ',
- {A 112 274} 'Orientation ',
- { 113 275} '? ',
- { 114 276} '? ',
- { 115 277} 'SamplesPerPixel ',
- {! 116 278} 'RowsPerStrip ',
- {! 117 279} 'StripByteCounts ',
- {A 118 280} 'MinSampleValue ',
- {A 119 281} 'MaxSampleValue ',
- {I 11A 282} 'XResolution ',
- {I 11B 283} 'YResolution ',
- {! 11C 284} 'PlanarConfiguration ',
- {I 11D 285} 'PageName ',
- { 11E 286} 'XPosition ',
- { 11F 287} 'YPosition ',
- {A 120 288} 'FreeOffsets ',
- {A 121 289} 'FreeByteCounts ',
- { 122 290} 'GrayResponseUnit ',
- { 123 291} 'GrayResponseCurve ',
- { 124 292} 'Group3Options ',
- { 125 293} 'Group4Options ',
- { 126 294} '? ',
- { 127 295} '? ',
- {I 128 296} 'ResolutionUnit ',
- {I 129 297} 'PageNumber ',
- { 12A 298} '? ',
- { 12B 299} '? ',
- { 12C 300} '? ',
- { 12D 301} 'ColorResponseCurves ',
- { 12E 302} '? ',
- { 12F 303} '? ',
- { 130 304} '? ',
- {I 131 305} 'SoftWare ',
- {I 132 306} 'DateTime ',
- { 133 307} 'ScreenFrequency ',
- { 134 308} 'ScreenAngle ',
- { 135 309} 'ScrennPattern ',
- { 136 310} 'SpotFunction ',
- { 137 311} 'InvertSpotFunction ',
- { 138 312} 'TransferFunction ',
- { 139 313} 'InvertTransferFunct.',
- { 13A 314} 'InkColor ',
- {I 13B 315} 'Artist ',
- {I 13C 316} 'HostComputer ',
- {! 13D 317} 'Predictor ',
- { 13E 318} 'WhitePoint ', { TargetPrinter ASCII LT. C'T 7/90 }
- { 13F 319} 'PrimaryChromaticitie', { StripByteCountMax SHORT LT. C'T 7/90 }
- { 140 320} 'ColorMap ');
-
-
- VAR TIFF : FILE;
- HDR : TIFFHDRTYP; { TIFF HEADER }
- IFD : TIFFIFDTYP; { IMAGE FILE DIRECTORY }
- BOR : BOOLEAN; { BYTEORDER REVERS }
- TIFERR : WORD; { FEHLER- NUMMER FÜR OPENTIFF }
- STP : WORD; { LAUFENDE NR. AKTUELLER STRIP }
- SBC : LONGINT; { BYTECOUNT AKTUELLER STRIP }
- BBC : BYTE; { BITCOUNT FÜR GETBITS }
-
- { TIFF- VARIABLE MIT DEFAULT- WERTEN }
- TIFCL : BYTE; { TIFF- CLASS }
- NSFT : BYTE; { NEW SUBFILE TYPE }
- SFT : BYTE; { SUBFILE TYPE }
- BPS : ARRAY[0..PLAINMAX] OF LONGINT; { BITS PER SAMPLE }
- COMPR : WORD; { COMPRESSION, DEFAULT = KEINE }
- PHINT : BYTE; { PHOTOMETRIC INTERPRETATION }
- SPP : BYTE; { SAMPLES PER PIXEL }
- RPS : WORD; { ROWS PER STRIP }
- XRES : REALTYP; { X- AUFLÖSUNG }
- YRES : REALTYP; { Y- AUFLÖSUNG }
- PLC : BYTE; { PLANAR CONFIGURATION }
- RESU : BYTE; { EINHEIT FÜR AUFLÖSUNG }
- CPRED : BYTE; { PREDICTOR FÜR COMPRESSION 5 }
-
- STRC : WORD; { ANZAHL STRIPS }
- { OFFSETS UND BYTECOUNTS PRO STRIP }
- STRI : ARRAY[1..STRIPMAX] OF STRIPTYP;
- BLNEG : BYTE; { BILEVEL NEGATIV }
- FO : BYTE; { FILLORDER }
- IMGWID : WORD; { BILD BREITE }
- IMGHIG : WORD; { BILD HÖHE }
-
- { GRAY RESPONSE CURVE }
- GRC : ARRAY[1..256] OF LONGINT;
- GRCC : WORD; { GRAY RESPONSE CURVE COUNT }
- GRU : WORD; { GRAY RESPONSE UNIT }
-
-
- PROCEDURE GRAYCURVE256;
- PROCEDURE CLOSETIFF;
- PROCEDURE TIFFEHLERMELDUNG;
- FUNCTION OPENTIFF(NAME:STRING):BOOLEAN;
- FUNCTION ZEIGETIFF(VAR NAME:STRING;WARTEN:BOOLEAN):CHAR;
- PROCEDURE GETBITS(ANZ:BYTE);
- PROCEDURE LIESCCITTRUN(SCHW:BOOLEAN;VAR BITS:WORD;VAR BV:BYTE);
-
-
- IMPLEMENTATION
-
-
- VAR BITBUF,PP : BYTE;
-
-
- { ********************************************************* }
-
-
- PROCEDURE GRAYCURVE256;
- VAR VP : ^VGAPALETTETYPE;
- I : WORD;
- R : REAL;
- GM : LONGINT;
- BEGIN
- IF GRCC = 0 THEN GRAYSCALE256 ELSE BEGIN
-
- GM := 0;
- FOR I := 1 TO GRCC DO IF GRC[I] > GM THEN GM := GRC[I];
- R := 63; R := R / GM;
-
- { 256- STUFIGE GRAUSKALA EINSTELLEN }
- GETMEM(VP,SIZEOF(VGAPALETTETYPE));
- FOR I := 0 TO 255 DO BEGIN
- VP^[I].R := 63 - ROUND(GRC[SUCC(I)] * R);
- VP^[I].R := ROUND(GRC[256 - I] * R);
- VP^[I].G := VP^[I].R;
- VP^[I].B := VP^[I].R;
- END;
- VGASETALLPALETTE(VP^);
- FREEMEM(VP,SIZEOF(VGAPALETTETYPE));
-
- END;
- END;
-
-
- FUNCTION SWAPLONG(L:LONGINT):LONGINT;
- VAR W : ARRAY[0..1] OF WORD ABSOLUTE L;
- I : WORD;
- BEGIN
- I := SWAP(W[0]);
- W[0] := SWAP(W[1]);
- W[1] := I;
- END; { SWAPLONG }
-
-
- FUNCTION MIN(A,B:WORD):WORD;
- BEGIN
- IF A < B THEN MIN := A ELSE MIN := B;
- END; { MIN }
-
-
- FUNCTION FREADWORD:WORD;
- VAR W : WORD;
- BEGIN
- BLOCKREAD(TIFF,W,2);
- IF BOR THEN FREADWORD := SWAP(W) ELSE FREADWORD := W;
- END; { FREADWORD }
-
-
- FUNCTION FREADLONG:LONGINT;
- VAR L : LONGINT;
- BEGIN
- BLOCKREAD(TIFF,L,4);
- IF BOR THEN FREADLONG := SWAPLONG(L) ELSE FREADLONG := L;
- END; { FREADLONG }
-
-
- PROCEDURE FREADWERT(TYP:BYTE;VAR DATA);
- VAR W : WORD;
- L : LONGINT;
- BEGIN
- CASE TYP OF
- 1 : BLOCKREAD(TIFF,DATA,1);
- 3 : BEGIN
- W := FREADWORD;
- MOVE(W,DATA,2);
- END;
- 4 : BEGIN
- L := FREADLONG;
- MOVE(L,DATA,4);
- END;
- END;
- END; { FREADWERT }
-
-
- PROCEDURE ZEIGETAG(NR:WORD);
- VAR I : WORD;
- L1,L2 : LONGINT;
- B : BYTE;
- W : WORD;
- CH1 : CHAR;
- BEGIN
- WITH IFD.I[NR] DO BEGIN
- IF (TA >= $FD) AND (TA <= $140) THEN BEGIN
- IF TAGNAMES[TA][1] = '?' THEN BEGIN
- WRITE(HEXW(TA),' Tag unbekannt ');
- END ELSE BEGIN
- WRITE(TAGNAMES[TA]);
- END;
- END ELSE BEGIN
- IF TA >= $8000 THEN WRITE(HEXW(TA),' Privat ')
- ELSE WRITE(HEXW(TA),' Tag unbekannt ');
- END; { CASE TA }
- CASE TY OF
- 1 : BEGIN
- WRITE(' B');
- IF L = 1 THEN WRITE(V:8) ELSE BEGIN
- SEEK(TIFF,V);
- FOR I := 1 TO MIN(3,L) DO BEGIN
- BLOCKREAD(TIFF,B,1);
- WRITE(B);
- IF I < L THEN WRITE(',');
- END; { NEXT I }
- END;
- END;
- 2 : BEGIN
- WRITE(' "');
- SEEK(TIFF,V);
- REPEAT
- BLOCKREAD(TIFF,CH1,1);
- IF CH1 <> #0 THEN WRITE(CH1);
- UNTIL CH1 = #0;
- WRITE('"');
- END;
- 3 : BEGIN
- WRITE(' W');
- IF L = 1 THEN WRITE(V:8) ELSE BEGIN
- WRITE(' ');
- SEEK(TIFF,V);
- FOR I := 1 TO MIN(3,L) DO BEGIN
- BLOCKREAD(TIFF,W,2);
- IF BOR THEN W := SWAP(W);
- WRITE(W);
- IF I < L THEN WRITE(',');
- END; { NEXT I }
- END;
- END;
- 4 : BEGIN
- WRITE(' L');
- IF L = 1 THEN WRITE(V:8) ELSE BEGIN
- WRITE(' ');
- SEEK(TIFF,V);
- FOR I := 1 TO MIN(3,L) DO BEGIN
- BLOCKREAD(TIFF,L1,4);
- IF BOR THEN L1 := SWAPLONG(L1);
- WRITE(L1);
- IF I < L THEN WRITE(',');
- END; { NEXT I }
- END;
- END;
- 5 : BEGIN
- WRITE(' R ');
- SEEK(TIFF,V);
- FOR I := 1 TO MIN(3,L) DO BEGIN
- BLOCKREAD(TIFF,L1,4);
- BLOCKREAD(TIFF,L2,4);
- IF BOR THEN BEGIN
- L1 := SWAPLONG(L1);
- L2 := SWAPLONG(L2);
- END;
- WRITE(L2,'/',L1);
- IF I < L THEN WRITE(',');
- END; { NEXT I }
- END;
- ELSE
- WRITE(' ? TYP ?');
- END; { CASE TY OF }
- END; { WITH IFD.I[NR] }
- END; { ZEIGETAG }
-
- { ********************************************************* }
-
-
- PROCEDURE CLOSETIFF; { CLOSE WENN OFFEN }
- BEGIN
- {$I-}
- IF (FILEREC(TIFF).MODE = $D7B1) OR
- (FILEREC(TIFF).MODE = $D7B2) OR
- (FILEREC(TIFF).MODE = $D7B3)
- THEN CLOSE(TIFF);
- {$I+}
- {$IFDEF FILEBUFFER}
- BCLOSE(1);
- {$ENDIF}
- END;
-
-
- PROCEDURE TIFFEHLERMELDUNG;
- VAR CH1 : CHAR;
- BEGIN
- CASE TIFERR OF
- 0 : EXIT;
- 1 : WRITELN('File nicht gefunden');
- 2 : WRITELN('File Lesefehler');
- 3 : WRITELN('Byteorder falsch : ',HEXW(HDR.O));
- 4 : WRITELN('TIFF- Version falsch : ',HEXW(HDR.ID));
- 5 : WRITELN('1. IFD- Pointer falsch : ',HEXL(HDR.IFDP));
- 6 : WRITELN('IFD- ist zu groß : ',IFD.N,IFDMAX:5,' ist möglich');
- 7 : WRITELN('nicht interpretierbarer Eintrag in IFD');
- ELSE
- WRITELN('unbekannter Fehler');
- END;
- END; { TIFFEHLERMELDUNG }
-
-
- FUNCTION OPENTIFF(NAME:STRING):BOOLEAN;
- VAR I,J,W : WORD;
- L : LONGINT;
- BEGIN
- { TIFF- VARIABLE MIT DEFAULT- WERTEN BELEGEN }
- TIFCL := 0; { TIFF - KLASSE }
- STRC := 1;
- NSFT := 0; { NEW SUBFILE TYPE }
- SFT := 0; { SUBFILE TYPE }
- BPS[0] := 1; { BITS PER SAMPLE }
- BPS[1] := 1; { BITS PER SAMPLE }
- COMPR := 1; { COMPRESSION, DEFAULT = KEINE }
- PHINT := 0; { PHOTOMETRIC INTERPRETATION }
- SPP := 1; { SAMPLES PER PIXEL }
- RPS := 0; { ROWS PER STRIP }
- XRES[0] := 0; { X- AUFLÖSUNG }
- XRES[1] := 0; { X- AUFLÖSUNG }
- YRES[0] := 0; { Y- AUFLÖSUNG }
- YRES[1] := 0; { X- AUFLÖSUNG }
- PLC := 1; { PLANAR CONFIGURATION }
- RESU := 2; { EINHEIT FÜR AUFLÖSUNG }
- CPRED := 1; { PREDICTOR FÜR COMPRESSION 5 }
- BLNEG := 0; { BILEVEL POSITIV }
- FO := 1; { FILLORDER MSBIT FIRST }
- FILLCHAR(STRI,SIZEOF(STRI),#0);
- GRCC := 0; { GRAY RESPONSE CURVE COUNT }
- FILLCHAR(GRC,SIZEOF(GRC),#0);
-
- {$I-}
- OPENTIFF := FALSE;
- ASSIGN(TIFF,NAME);
- TIFERR := 1;
- RESET(TIFF,1);
- IF IORESULT <> 0 THEN EXIT;
-
- {$IFDEF FILEBUFFER}
- IF NOT BOPEN(1,20000) THEN EXIT;
- {$ENDIF}
-
- { HEADER EINLESEN }
- TIFERR := 2;
- BLOCKREAD(TIFF,HDR,SIZEOF(HDR));
- IF IORESULT <> 0 THEN EXIT;
- CASE HDR.O OF
- $4949 : BEGIN
- BOR := FALSE;
- END;
- $4D4D : BEGIN
- BOR := TRUE;
- HDR.ID := SWAP(HDR.ID);
- HDR.IFDP := SWAPLONG(HDR.IFDP);
- END;
- ELSE
- TIFERR := 3;
- EXIT;
- END;
- HDR.S := FILESIZE(TIFF);
- TIFERR := 4;
- IF HDR.ID <> 42 THEN EXIT;
- TIFERR := 5;
- IF HDR.IFDP >= HDR.S THEN EXIT;
-
- { 1. IFD EINLESEN }
- SEEK(TIFF,HDR.IFDP);
- TIFERR := 2;
- BLOCKREAD(TIFF,IFD.N,2);
- IF IORESULT <> 0 THEN EXIT;
- IF BOR THEN IFD.N := SWAP(IFD.N);
- IF IFD.N > IFDMAX THEN BEGIN
- { IFD IST ZU GROß }
- TIFERR := 6;
- EXIT;
- END;
- BLOCKREAD(TIFF,IFD.I,IFD.N * 12);
- IF IORESULT <> 0 THEN EXIT;
- { OFFENBAR MUß NICHT UNBEDINGT EIN NEXT-IFD-POINTER VORHANDEN SEIN ? }
- BLOCKREAD(TIFF,IFD.NX,4);
- IF IORESULT <> 0 THEN IFD.NX := 0 {EXIT};
- {}
- IF BOR THEN BEGIN
- IFD.NX := SWAPLONG(IFD.NX);
- FOR I := 1 TO IFD.N DO BEGIN
- IFD.I[I].TA := SWAP(IFD.I[I].TA);
- IFD.I[I].TY := SWAP(IFD.I[I].TY);
- IFD.I[I].L := SWAPLONG(IFD.I[I].L);
- IFD.I[I].V := SWAPLONG(IFD.I[I].V);
- END;
- END;
-
- { WERTE AUS IFD IN VARIABLE ÜBERTRAGEN }
- TIFERR := 7;
- FOR I := 1 TO IFD.N DO BEGIN
- WITH IFD.I[I] DO BEGIN
- CASE TA OF
- $FD : BEGIN { TIFF CLASS }
- IF L <> 1 THEN EXIT;
- TIFCL := V;
- END;
- $FE : BEGIN { NEW SUBFILE TYPE }
- IF L <> 1 THEN EXIT;
- NSFT := V;
- END;
- $FF : BEGIN { SUBFILE TYPE }
- IF L <> 1 THEN EXIT;
- SFT := V;
- END;
- $100 : BEGIN { IMAGE WIDTH }
- IF L <> 1 THEN EXIT;
- IMGWID := V;
- END;
- $101 : BEGIN { IMAGE HEIGHT }
- IF L <> 1 THEN EXIT;
- IMGHIG := V;
- END;
- $102 : BEGIN { BITS PER SAMPLE - PRO PLANE }
- BPS[0] := L;
- IF L = 1 THEN BPS[1] := V ELSE BEGIN
- SEEK(TIFF,V);
- FOR J := 1 TO MIN(PLAINMAX,L) DO BEGIN
- FREADWERT(TY,BPS[J]);
- END;
- END;
- END;
- $103 : BEGIN { COMPRESSION }
- IF L <> 1 THEN EXIT;
- COMPR := V;
- END;
- $106 : BEGIN { PHOTOMETRIC INTERPRETATION }
- IF L <> 1 THEN EXIT;
- PHINT := V;
- IF PHINT = 1 THEN BLNEG := $FF;
- END;
- $10A : BEGIN { FILLORDER }
- IF L <> 1 THEN EXIT;
- FO := V;
- END;
- $111 : BEGIN { STRIP OFFSETS }
- STRC := L;
- IF STRC > STRIPMAX THEN STRC := STRIPMAX;
- IF L = 1 THEN STRI[1].O := V ELSE BEGIN
- SEEK(TIFF,V);
- FOR J := 1 TO STRC DO BEGIN
- FREADWERT(TY,STRI[J].O);
- END;
- END;
- END;
- $115 : BEGIN { SAMPLES PER PIXEL }
- IF L <> 1 THEN EXIT;
- SPP := V;
- END;
- $116 : BEGIN { ROWS PER STRIP }
- IF L <> 1 THEN EXIT;
- RPS := V;
- END;
- $117 : BEGIN { STRIP BYTECOUNTS }
- {@@@}
- IF L <= STRIPMAX THEN BEGIN
- IF STRC <> L THEN EXIT;
- END;
- IF L = 1 THEN STRI[1].B := V ELSE BEGIN
- SEEK(TIFF,V);
- FOR J := 1 TO STRC DO BEGIN
- FREADWERT(TY,STRI[J].B);
- END;
- END;
- END;
- $11A : BEGIN { X- RESOLUTION }
- IF L <> 1 THEN EXIT;
- SEEK(TIFF,V);
- BLOCKREAD(TIFF,XRES,8);
- IF BOR THEN BEGIN
- XRES[0] := SWAPLONG(XRES[0]);
- XRES[1] := SWAPLONG(XRES[1]);
- END;
- END;
- $11B : BEGIN { Y- RESOLUTION }
- IF L <> 1 THEN EXIT;
- SEEK(TIFF,V);
- BLOCKREAD(TIFF,YRES,8);
- IF BOR THEN BEGIN
- YRES[0] := SWAPLONG(YRES[0]);
- YRES[1] := SWAPLONG(YRES[1]);
- END;
- END;
- $11C : BEGIN { PLANAR CONFIGURATION }
- IF L <> 1 THEN EXIT;
- PLC := V;
- END;
- $122 : BEGIN { GRAY RESPONSE UNIT }
- IF L <> 1 THEN EXIT;
- GRU := V;
- END;
- $123 : BEGIN { GRAY RESPONSE CURVE }
- IF L = 1 THEN EXIT; { GRAUKEIL MIT 1 WERT IGNORIEREN }
- GRCC := L;
- SEEK(TIFF,V);
- FOR J := 1 TO MIN(256,L) DO BEGIN
- FREADWERT(TY,GRC[J]);
- END;
- END;
- $128 : BEGIN { RESOLUTION UNIT }
- IF L <> 1 THEN EXIT;
- RESU := V;
- END;
- $12D : BEGIN { COMPRESSION PREDICTOR FÜR LZW- KOMPRESSION }
- IF L <> 1 THEN EXIT;
- CPRED := V;
- END;
- END; { CASE IFD.I[I].TA }
- END; { WITH IFD.I[I] }
- END; { NEXT I }
- { TIFF- KLASSE FESTLEGEN }
- IF TIFCL = 0 THEN BEGIN
- CASE PHINT OF
- 0,1 : BEGIN
- IF BPS[1] = 1 THEN TIFCL := 1 { CLASS B - BILEVEL }
- ELSE TIFCL := 2; { CLASS G - GRAYSCALE }
- END;
- 2 : BEGIN
- TIFCL := 4; { CLASS R - RGB }
- IF SPP <> 3 THEN TIFCL := 0;
- END;
- 3 : BEGIN
- TIFCL := 3; { CLASS P - PALETTE }
- IF SPP <> 1 THEN TIFCL := 0;
- END;
- ELSE
- TIFCL := 0;
- END; { CASE PHINT OF }
- END; { IF TIFCL = 0 }
-
-
- TIFERR := 0;
- OPENTIFF := TRUE;
- END; { OPENTIFF }
-
-
- FUNCTION ZEIGETIFF(VAR NAME:STRING;WARTEN:BOOLEAN):CHAR;
- VAR I,J : WORD;
- CH1 : CHAR;
- BEGIN
- IF NOT OPENTIFF(NAME) THEN BEGIN
- WRITELN('FEHLER BEIM LESEN FILE ',NAME);
- TIFFEHLERMELDUNG;
- IF WARTEN THEN BEGIN
- WRITELN('Taste drücken ');
- CH1 := READKEY; IF CH1 = #0 THEN CH1 := READKEY;
- END;
- END ELSE BEGIN
- WRITE(NAME:24,' ');
- WRITE('Filegröße ',HDR.S);
- WRITE(' Order = ');
- IF BOR THEN WRITE('Highbyte first ')
- ELSE WRITE('Lowbyte first ');
- WRITELN;
-
- CASE TIFCL OF
- 1 : WRITE('TIFF- Klasse B ');
- 2 : WRITE('TIFF- Klasse G ');
- 3 : WRITE('TIFF- Klasse P ');
- 4 : WRITE('TIFF- Klasse R ');
- ELSE
- WRITE('TIFF- Klasse unbekannt ');
- END; { CASE TIFCL }
- CASE PHINT OF
- 0,1 : BEGIN
- IF BPS[1] = 1 THEN WRITE('Bilevel ') ELSE WRITE('Grayscale ');
- IF PHINT = 0 THEN WRITE('positiv') ELSE WRITE('negativ');
- END;
- 2 : WRITE('RGB');
- 3 : WRITE('Palette Color');
- 4 : WRITE('Transparency Mask');
- 5 : WRITE('Separation Layer');
- ELSE
- WRITE('PhotometricInt. ',PHINT,' UNBEKANNT');
- END; { CASE PHINT }
- IF PHINT > 1 THEN BEGIN
- CASE PLC OF
- 1 : WRITE(' single Plane');
- 2 : BEGIN
- WRITE(SPP:3);
- WRITE(' separate Planes');
- END;
- ELSE
- WRITE('PlanarConf. ',PLC,' UNBEKANNT');
- END; { CASE PLINT }
- END;
- IF BPS[1] > 1 THEN WRITE(' ',BPS[1],' Bit/Sample');
- WRITELN;
-
- CASE SFT OF
- 0 : BEGIN
- IF NSFT = 0 THEN WRITE('full Resolution ');
- IF (NSFT AND 1) <> 0 THEN WRITE('reduced Resolution ');
- IF (NSFT AND 2) <> 0 THEN WRITE('single Page of Multipage ');
- IF (NSFT AND 4) <> 0 THEN WRITE('Transparency Mask ');
- IF (NSFT AND 8) <> 0 THEN WRITE('Separation Layer ');
- END;
- 1 : WRITE('full Resolution ');
- 2 : WRITE('reduced Resolution ');
- 3 : WRITE('single Page of Multipage ');
- ELSE
- WRITE('Subfile Type UNBEKANNT');
- END; { CASE SFT }
- WRITE('Kompression : ');
- CASE COMPR OF
- 1 : WRITE('keine');
- 2 : WRITE('CCITT Group 3, 1- Dimensional');
- 3 : WRITE('FAX CCITT Group 3');
- 4 : WRITE('FAX CCITT Group 4');
- 5 : BEGIN
- WRITE('LZW ');
- IF CPRED <> 1 THEN WRITE('Predictor ',CPRED,' UNBEKANNT');
- END;
- ELSE
- IF COMPR = $8005 THEN WRITE('PackBits')
- ELSE WRITE('UNBEKANNT');
- END; { CASE COMPR }
- WRITELN;
-
- WRITE('X- Auflösung ',XRES[1],'/',XRES[0]);
- CASE RESU OF
- 2 : WRITE(' Zoll');
- 3 : WRITE(' cm ');
- ELSE
- WRITE(' ');
- END; { CASE RESU }
- WRITE(' ');
- WRITE('Y- Auflösung ',YRES[1],'/',YRES[0]);
- CASE RESU OF
- 2 : WRITE(' Zoll');
- 3 : WRITE(' cm');
- END; { CASE RESU }
- IF STRC > 1 THEN WRITE(STRC:7,' Strips');
- WRITELN;
-
- WRITE(IFD.N,' TAGs, IFD- Adresse = ',HDR.IFDP);
- IF IFD.NX <> 0 THEN WRITE(' next IFD = ',IFD.NX);
- WRITELN;
-
- FOR I := 1 TO IFD.N DO BEGIN
- ZEIGETAG(I);
- IF WHEREX > 40 THEN WRITELN ELSE GOTOXY(40,WHEREY);
- END; { NEXT I }
- END;
-
- TEXTATTR := $4E;
- GOTOXY(1,25);
- CLREOL;
- WRITE('<Esc> = Programm Ende, '' '' = Bild ansehen, andere Taste = File auswählen');
- TEXTATTR := $07;
-
- IF WARTEN THEN BEGIN
- CH1 := READKEY; IF CH1 = #0 THEN CH1 := READKEY;
- END ELSE CH1 := ' ';
- GOTOXY(1,25);
- CLREOL;
- ZEIGETIFF := CH1;
- END; { ZEIGETIFF }
-
-
- PROCEDURE GETBITS(ANZ:BYTE);
- VAR I : BYTE;
- J : INTEGER;
- BEGIN
- FOR I := 1 TO ANZ DO BEGIN
- IF BBC = 0 THEN BEGIN
- {$IFDEF FILEBUFFER }
- BGET(1,TIFF,@PP,1);
- {$ELSE}
- BLOCKREAD(TIFF,PP,1,J);
- {$ENDIF}
- DEC(SBC);
- BBC := 8;
- END;
- BITBUF := BITBUF SHL 1;
- IF (PP AND $80) <> 0 THEN INC(BITBUF);
- PP := PP SHL 1;
- DEC(BBC);
- END; { NEXT I }
- END; { GETBITS }
-
-
- { SETZT BV AUF SCHWARZ/WEIß UND BITS AUF RUNLENGTH }
- PROCEDURE LIESCCITTRUN(SCHW:BOOLEAN;VAR BITS:WORD;VAR BV:BYTE);
- CONST T2 : ARRAY[0.. 3] OF BYTE =
- ($FF,$FF,$83,$82);
- T3 : ARRAY[0.. 7] OF BYTE =
- ($FF,$FF,$81,$84,$FF,$FF,$FF,$FF);
- T4 : ARRAY[0..15] OF BYTE =
- ($FF,$FF,$86,$85,$FF,$FF,$FF, 2, 3,$FF,$FF, 4, 5,$FF, 6, 7);
- T5 : ARRAY[0..31] OF BYTE =
- ($FF,$FF,$FF,$87,$FF,$FF,$FF, 10, 11,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$42, 8, 9,$FF,$FF,$FF, $FF,$FF,$FF,$41,$FF,$FF,$FF,$FF);
- T6 : ARRAY[0..63] OF BYTE =
- ($FF,$FF,$FF, 13,$89,$88,$FF, 1, 12,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$43, $5A,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF, 16, 17,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF, 14, 15,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T7 : ARRAY[0..63] OF BYTE =
- ($FF,$FF,$FF, 22, 23,$8B,$FF,$8C, 20,$FF,$FF,$FF, 19,$FF,$FF,$FF,
- $FF,$FF,$FF, 26,$FF,$FF,$FF, 21, 28,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF, 27,$FF,$FF, 18, 24,$FF,$FF, 25,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$44, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T8 : ARRAY[0..127] OF BYTE =
- ($FF,$FF, 29, 30, 45, 46,$FF,$8E, $FF,$FF, 47, 48,$FF,$FF,$FF,$FF,
- $FF,$FF, 33, 34, 35, 36, 37, 38, $FF,$FF, 31, 32,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF, 53, 54,$FF,$FF, 39, 40, 41, 42, 43, 44,$FF,$FF,
- $FF,$FF, 61, 62, 63, 0,$45,$46, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF, 59, 60,$FF,$FF,$FF,$FF,
- $FF,$FF, 49, 50, 51, 52,$FF,$FF, 55, 56, 57, 58,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$47,$48,$FF,$4A, $49,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T9 : ARRAY[0..127] OF BYTE =
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $57,$58,$59,$5B,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$4B,$4C,$FF,$FF,
- $FF,$FF,$4D,$4E,$4F,$50,$51,$52, $53,$54,$55,$56,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T10 : ARRAY[0..63] OF BYTE =
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $92,$FF,$FF,$FF,$FF,$FF,$FF,$C1,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$90, $91,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$80, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T121 : ARRAY[0..31] OF BYTE =
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$5F,$60,$61,$62,$63,$64, $FF,$FF,$FF,$FF,$65,$66,$67,$68);
- T122 : ARRAY[0..255] OF BYTE =
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF, 52,$FF,$FF, 55, 56,$FF,$FF, 59, 60,$FF,$FF,$FF,
- $FF,$FF,$FF,$45,$46,$47,$FF, 53, 54,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF, 50, 51, 44, 45, 46, 47, 57, 58, 61,$44,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF, 48, 49, 62, 63, 30, 31, 32, 33, 40, 41,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $42,$43, 26, 27, 28, 29,$FF,$FF,
- $FF,$FF, 34, 35, 36, 37, 38, 39, $FF,$FF, 42, 43,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF);
- T13 : ARRAY[0..$37] OF BYTE =
- ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF, $FF,$FF,$CA,$CB,$CC,$CD,$FF,$FF,
- $FF,$FF,$D4,$D5,$D6,$D7,$FF,$FF, $FF,$FF,$D8,$D9,$FF,$FF,$FF,$FF,
- $FF,$FF,$FF,$FF,$DA,$DB,$FF,$FF, $FF,$FF,$FF,$FF,$C8,$C9,$FF,$FF,
- $FF,$FF,$CE,$CF,$D0,$D1,$D2,$D3);
-
- VAR I : BYTE;
-
- LABEL FEHLER;
-
- FUNCTION GETVAL(WERT:BYTE):BOOLEAN;
- BEGIN
- GETVAL := FALSE;
- IF WERT = $FF THEN EXIT;
- IF I <> 12 THEN BEGIN { T12x ENTHÄLT KEINE FARBINFORMATION }
- IF SCHW <> (WERT > $7F) THEN EXIT;
- BV := WERT AND $80;
- END;
- IF (WERT AND $40) <> 0 THEN BEGIN
- INC(BITS,(WERT AND $3F) SHL 6);
- BITBUF := 0;
- GETBITS(1);
- I := 1;
- END ELSE BEGIN
- INC(BITS,WERT AND $3F);
- GETVAL := TRUE;
- END;
- END; { GETVAL }
-
- BEGIN { LIESCCITTRUN }
- BITS := 0;
- BITBUF := 0;
- GETBITS(2);
- I := 2;
- REPEAT
- CASE I OF
- 0,1 : BEGIN END;
- 2 : IF GETVAL(T2[BITBUF]) THEN EXIT;
- 3 : IF GETVAL(T3[BITBUF]) THEN EXIT;
- 4 : IF GETVAL(T4[BITBUF]) THEN EXIT;
- 5 : IF GETVAL(T5[BITBUF]) THEN EXIT;
- 6 : IF GETVAL(T6[BITBUF]) THEN EXIT;
- 7 : IF BITBUF < $40 THEN BEGIN
- IF SCHW AND (BITBUF = 4) THEN BEGIN
- BV := $80;
- INC(BITS,10);
- EXIT;
- END;
- IF GETVAL(T7[BITBUF]) THEN EXIT;
- END;
- 8 : BEGIN
- IF SCHW AND (BITBUF = 4) THEN BEGIN
- BV := $80;
- INC(BITS,13);
- EXIT;
- END;
- IF BITBUF < $80 THEN BEGIN
- IF GETVAL(T8[BITBUF]) THEN EXIT;
- END;
- END;
- 9 : BEGIN
- IF SCHW AND (BITBUF = $18) THEN BEGIN
- BV := $80;
- INC(BITS,15);
- EXIT;
- END;
- IF BITBUF > $7F THEN BEGIN
- IF GETVAL(T9[BITBUF AND $7F]) THEN EXIT;
- END;
- END;
- 10 : { IF BITBUF < $40 THEN }IF GETVAL(T10[BITBUF]) THEN EXIT;
- 11 : BEGIN
- IF SCHW THEN BEGIN
- BV := $80;
- CASE BITBUF OF
- $17 : BEGIN
- INC(BITS,24);
- EXIT;
- END;
- $18 : BEGIN
- INC(BITS,25);
- EXIT;
- END;
- $28 : BEGIN
- INC(BITS,23);
- EXIT;
- END;
- $37 : BEGIN
- INC(BITS,22);
- EXIT;
- END;
- $67 : BEGIN
- INC(BITS,19);
- EXIT;
- END;
- $68 : BEGIN
- INC(BITS,20);
- EXIT;
- END;
- $6C : BEGIN
- INC(BITS,21);
- EXIT;
- END;
- END; { CASE BITBUF }
- END ELSE BV := 0; { IF SCHW }
- { DECODIERUNG SCHWARZ ODER WEIß }
- CASE BITBUF OF
- 8 : INC(BITS,1792);
- $0C : INC(BITS,1856);
- $0D : INC(BITS,1920);
- END; { CASE BITBUF }
- END;
- 12 : BEGIN
- IF BITBUF = 1 THEN EXIT; { EOL }
- IF BITBUF < $20 THEN BEGIN
- IF GETVAL(T121[BITBUF]) THEN BEGIN
- IF SCHW THEN BV := $80 ELSE BV := 0;
- EXIT;
- END;
- END ELSE BEGIN
- IF SCHW THEN BEGIN
- IF GETVAL(T122[BITBUF]) THEN EXIT;
- END; { IF SCHW }
- END;
- END;
- 13 : BEGIN
- IF BITBUF IN [$40..$7F] THEN BEGIN
- IF GETVAL(T13[BITBUF-$40]) THEN EXIT;
- END ELSE GOTO FEHLER;
- END;
- END; { CASE I }
- IF BITBUF > 127 THEN BEGIN
- WRITE(#7);
- GOTO FEHLER;
- END;
- GETBITS(1);
- INC(I);
- UNTIL I > 13;
-
- FEHLER: { NA WAS WOHL ? }
- WRITE('!!');
- IF SCHW THEN WRITE('S') ELSE WRITE('W');
- WRITE(I:3,':',BITS,' ',HEXB(BITBUF),' !!');
- BV := 0;
- IF BITS = 0 THEN BITS := IMGWID;
- END; { LIESCCITTRUN }
-
-
-
- END. { TIFFUNIT }
-