Преобразование Magickwand в TIFF и сжатие CCITT group 4 дает несжатое изображение

Попытка преобразовать растровое изображение 24 бит на пиксель в черно-белый TIFF со сжатием CCITT group 4. Результатом является изображение TIFF 1 bpp, как и ожидалось, но без сжатия.

Я использую FreePascal, у которого есть привязки magickwand, и статус никогда не будет 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

Что я делаю неправильно?

Изменить: решено; получил решение за пределами сайта: перечисление CompressionType в привязках FreePascal, вероятно, устарело - Group4Compression было 4 (IIRC), а должно быть 7.

Я дам награду Марку Сетчеллу, поскольку его ответ был необходимой частью решения. Исходный код выше обновлен до правильной версии.


person reiniero    schedule 08.09.2014    source источник
comment
Может быть, также установить качество сжатия изображения магии? См. Также imagemagick.org/discourse-server/ для единственного фрагмента кода, который я смог найти со сжатием group4   -  person Marco van de Voort    schedule 13.09.2014
comment
Нет, не помогает ...   -  person reiniero    schedule 14.09.2014
comment
Вы используете последнюю версию ImageMagick? Возможно, это исправленная ошибка.   -  person dlemstra    schedule 14.09.2014
comment
Можете ли вы разместить ссылку на полученный выходной файл?   -  person Mark Setchell    schedule 14.09.2014
comment
Выходной файл: filehorst.de/d/bhlbjHgp; с использованием dll от 20.02.2013 в Windows (возникли проблемы с моей системой Linux, в которой использовалась последняя версия imagemagick). Если новая версия успешно сгенерирует вывод, сообщите мне (тем временем, я пойду на охоту за новой версией / попытаюсь исправить свои проблемы с линковкой imagemagick в Linux)!   -  person reiniero    schedule 14.09.2014
comment
Пожалуйста, не редактируйте свой вопрос, а вставьте «Исправлено» или «Решено». Это делает ваш вопрос не вопросом. Добавьте свое решение и исправленный код в качестве ответа.   -  person Jongware    schedule 20.09.2014
comment
@Jongware: вы заметили, что заголовок был отредактирован? Пожалуйста, укажите, как я должен был временно удержать SO людей от тратить время на решенный вопрос, пока я связывался с парнем за пределами сайта, который дал мне решение о написании SO-ответа, чтобы он мог получить награду. Спасибо.   -  person reiniero    schedule 21.09.2014


Ответы (1)


По крайней мере, с версией PHP кажется, что установка типа сжатия на самом деле не сжимает изображение - см. Комментарии внизу здесь.

Во всех обнаруженных мною примерах также показано, что вы должны впоследствии вызвать MagickSetImageCompressionQuality() и StripImage(), чтобы фактически выполнить сжатие - см. здесь.

person Mark Setchell    schedule 14.09.2014
comment
Спасибо. К сожалению, добавление MagickSetImageCompressionQuality (с 0 или 100) и MagickStripImage непосредственно перед записью не имеет никакого эффекта. Я попробую преобразовать код в Python или PHP и запустить его в тестовой системе Linux, чтобы проверить, работает ли это ... - person reiniero; 14.09.2014
comment
Спасибо, Марк, мне действительно нужно было добавить эти вызовы, но я столкнулся с другой проблемой; решено - см. выше. - person reiniero; 15.09.2014
comment
Рад оказать помощь! Удачи в вашем проекте и спасибо :-) - person Mark Setchell; 15.09.2014