3

CCITT グループ 4 圧縮で 24 bpp ビットマップを白黒 TIFF に変換しようとしています。結果は期待どおりの TIFF 1 bpp イメージですが、圧縮されていません。

Magickwand バインディングを備えた FreePascal を使用しており、ステータスが MagickFalse になることはありません。

MagickWandGenesis;
wand := NewMagickWand;
try
  status := MagickReadImage(wand,PChar(InputFile));
  if (status = MagickFalse) then HandleError;

  status := MagickSetImageFormat(wand,'TIFF');
  if (status = MagickFalse) then HandleError;

  // convert to black & white/lineart
  status := MagickSetImageType(wand,BilevelType);
  if (status = MagickFalse) then HandleError;

  // Group4Compression seems defined as 4 which 
  // apparently doesn't match imagemagick source. Bug:
  //http://mantis.freepascal.org/view.php?id=26723
  status := MagickSetImageCompression(wand,CompressionType(7)); //was Group4Compression
  if (status = MagickFalse) then HandleError;

  // Apparently set(image)compresionquality and
  // stripimage are necessary to actually compress
  status := MagickSetImageCompressionQuality(wand,0);
  if (status = MagickFalse) then HandleError;
  status := MagickStripImage(wand);
  if (status = MagickFalse) then HandleError;

  status := MagickWriteImage(wand,PChar(OutputFile));
  if (status = MagickFalse) then HandleError;

finally
  wand := DestroyMagickWand(wand);
end;
MagickWandTerminus;

http://filehorst.de/d/bmqjzDuBのソース画像

http://filehorst.de/d/bluhjivqの元の (欠陥のある) プログラム ソース コード

http://filehorst.de/d/bhlbjHgpの元の (欠陥のある) 出力画像

私は何を間違っていますか?

編集:解決しました。オフサイトでソリューションを取得しました: FreePascal バインディングの CompressionType enum はおそらく古くなっています - Group4Compression は 4 (IIRC) でしたが、7 である必要があります。

賞金は Mark Setchell に差し上げます。彼の答えはソリューションに必要な部分だったからです。上記のソース コードを正しいバージョンに更新しました。

4

1 に答える 1

0

少なくとも PHP バージョンでは、圧縮タイプを設定しても実際には画像が圧縮されないようです。ここの下部にあるコメントを参照してください。

また、私が見つけたすべての例で、後で呼び出して実際に圧縮を行う必要があることも示していますMagickSetImageCompressionQuality()-StripImage()こちらを参照してください

于 2014-09-14T12:49:36.517 に答える