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 に差し上げます。彼の答えはソリューションに必要な部分だったからです。上記のソース コードを正しいバージョンに更新しました。