ImageMagick делает разные изображения в Windows и Linux - PullRequest
3 голосов
/ 17 июня 2011

Мне нужен пакетный процесс для создания мобильных изображений и я решил использовать ImageMagick, но, к сожалению, одним из моих требований является то, что полученные изображения одинаковы для разных ОС, так как я отправляю их назад и вперед между моей локальной системой (Windows ) и сервер (Linux). Кажется, однако, всякий раз, когда я звоню

convert test.jpg -resize 25% test-small.jpg

процесс создает разные образы на обеих машинах. Я знаю это, потому что, когда я использую контрольную сумму, значения не совсем совпадают.

Кто-нибудь знает какие-либо причины, по которым это может произойти? И, может быть, каким-то образом обойти это, используя другой исполняемый файл или передав параметр, который будет создавать одинаковые образы в разных ОС?

Ответы [ 3 ]

1 голос
/ 17 июня 2011
  1. В файлах больше, чем пикселей. Если вы собираетесь сравнивать изображения, напишите контрольную сумму, которая работает только с данными декодированных пикселей. Это по крайней мере скажет вам, если изображения будут выглядеть одинаково. Внутренние элементы файла могут отличаться из-за множества факторов.

  2. Изменение размера зависит от арифметики с плавающей точкой, и вы не можете рассчитывать на то, что она одинакова для всех машин. Поэтому вместо использования контрольной суммы вы можете посмотреть, находится ли каждый пиксель в пределах допуска от соответствующего пикселя в другом файле.

Взгляните на эти ссылки:

1 голос
/ 17 июня 2011

Алгоритмы JPEG являются недетерминированными.Невозможно гарантировать, что одно и то же изображение будет сгенерировано в двух системах или даже между двумя вызовами в одной и той же системе.

0 голосов
/ 13 октября 2012

Полагаться на «контрольную сумму» или «md5sum» или аналогичные для сравнения двух изображений не является разумным выбором. Это может только проверить, действительно ли файлы идентичны. Однако, если у вас разные результаты, это может быть вызвано тем, что какой-то случайный метаданный отличается только одним байтом (например, простой временной меткой), хотя разницы в пикселях нет вообще.

Чтобы обнаружить пиксельные различия между двумя изображениями, вы можете использовать ImageMagick's compare, например:

compare  image1.jpg  image2.jpg  delta.jpg

Для цветных входных изображений результирующее delta.jpg будет использовать image1.jpb в качестве светло-серого фона и отображать различия в красном цвете. Чтобы получить красно-белое дельта-изображение без светло-серого фона, используйте

compare  image1.jpg  image2.jpg  -compose src  delta.jpg

Примеры изображений этой техники можно найти здесь :

...