ImageMagick создание различных изображений на Windows и Linux


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

convert test.jpg -resize 25% test-small.jpg
Процесс создает различные изображения на обеих машинах. Я знаю это, потому что, когда я использую контрольную сумму, значения не совсем совпадают.

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

3 3

3 ответа:

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

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

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

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

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

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

compare  image1.jpg  image2.jpg  delta.jpg

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

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

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

  • ImageMagick: "Diff" изображение
    слева: Изображение с текстом Центр: исходное изображение справа: различия (=текст) красным цветом пикселы. Только красные пикселы разницы; идентичные пикселы белые