ImagingTiff.pas 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. unit ImagingTiff;
  2. {$I ImagingOptions.inc}
  3. interface
  4. uses
  5. SysUtils, Imaging, ImagingTypes, ImagingUtility, ImagingIO;
  6. type
  7. { TIFF (Tag Image File Format) loader/saver base class.}
  8. TBaseTiffFileFormat = class(TImageFileFormat)
  9. protected
  10. FCompression: Integer;
  11. FJpegQuality: Integer;
  12. procedure Define; override;
  13. public
  14. function TestFormat(Handle: TImagingHandle): Boolean; override;
  15. { Specifies compression scheme used when saving TIFF images. Supported values
  16. are 0 (Uncompressed), 1 (LZW), 2 (PackBits RLE), 3 (Deflate - ZLib), 4 (JPEG),
  17. 5 (CCITT Group 4 fax encoding - for binary images only).
  18. Default is 1 (LZW). Note that not all images can be stored with
  19. JPEG compression - these images will be saved with default compression if
  20. JPEG is set.}
  21. property Compression: Integer read FCompression write FCompression;
  22. { Controls compression quality when selected TIFF compression is Jpeg.
  23. It is number in range 1..100. 1 means small/ugly file,
  24. 100 means large/nice file. Accessible trough ImagingTiffJpegQuality option.}
  25. property JpegQuality: Integer read FJpegQuality write FJpegQuality;
  26. end;
  27. const
  28. TiffCompressionOptionNone = 0;
  29. TiffCompressionOptionLzw = 1;
  30. TiffCompressionOptionPackbitsRle = 2;
  31. TiffCompressionOptionDeflate = 3;
  32. TiffCompressionOptionJpeg = 4;
  33. TiffCompressionOptionGroup4 = 5;
  34. { Read only metadata info - name of compression scheme (LZW, none, JPEG, G4, ...)
  35. used in last loaded TIFF. }
  36. SMetaTiffCompressionName = 'TiffCompressionName';
  37. { Original resolution unit of loaded TIFF. Type is UInt.
  38. RESUNIT_NONE = 1; // no meaningful units
  39. RESUNIT_INCH = 2; // english
  40. RESUNIT_CENTIMETER = 3; // metric }
  41. SMetaTiffResolutionUnit = 'TiffResolutionUnit';
  42. implementation
  43. {$IFNDEF DONT_LINK_FILE_FORMATS}
  44. // So far we have only one TIFF support implementation - libtiff
  45. {$DEFINE USE_LIBTIFF}
  46. // libtiff for FPC ARM is disabled by default due to potential hardfp/softfp
  47. // ABI problems (without linking to any lib FPC generated binary does not call "ld"
  48. // and hardfp exe can run on softfp target). If you know what you're doing enable it.
  49. {$IF Defined(FPC) and Defined(CPUARM)}
  50. {$UNDEF USE_LIBTIFF}
  51. {$IFEND}
  52. // Not even dynamic linking works at the moment
  53. {$IF Defined(DELPHI) and Defined(MACOS))}
  54. {$UNDEF USE_LIBTIFF}
  55. {$IFEND}
  56. uses
  57. {$IFDEF USE_LIBTIFF}
  58. ImagingTiffLib,
  59. {$ENDIF}
  60. ImagingExtFileFormats;
  61. {$ENDIF}
  62. const
  63. STiffFormatName = 'Tagged Image File Format';
  64. STiffMasks = '*.tif,*.tiff';
  65. TiffDefaultCompression = 1;
  66. TiffDefaultJpegQuality = 90;
  67. const
  68. TiffBEMagic: TChar4 = 'MM'#0#42;
  69. TiffLEMagic: TChar4 = 'II'#42#0;
  70. {
  71. TBaseTiffFileFormat implementation
  72. }
  73. procedure TBaseTiffFileFormat.Define;
  74. begin
  75. inherited;
  76. FName := STiffFormatName;
  77. FFeatures := [ffLoad, ffSave, ffMultiImage];
  78. FCompression := TiffDefaultCompression;
  79. FJpegQuality := TiffDefaultJpegQuality;
  80. AddMasks(STiffMasks);
  81. RegisterOption(ImagingTiffCompression, @FCompression);
  82. RegisterOption(ImagingTiffJpegQuality, @FJpegQuality);
  83. end;
  84. function TBaseTiffFileFormat.TestFormat(Handle: TImagingHandle): Boolean;
  85. var
  86. Magic: TChar4;
  87. ReadCount: LongInt;
  88. begin
  89. Result := False;
  90. if Handle <> nil then
  91. begin
  92. ReadCount := GetIO.Read(Handle, @Magic, SizeOf(Magic));
  93. GetIO.Seek(Handle, -ReadCount, smFromCurrent);
  94. Result := (ReadCount >= SizeOf(Magic)) and
  95. ((Magic = TiffBEMagic) or (Magic = TiffLEMagic));
  96. end;
  97. end;
  98. end.