ImageMagick создание различных изображений на Windows и Linux
Мне нужен пакетный процесс для создания мобильных образов, и я решил использовать ImageMagick, но, к сожалению, одно из моих требований заключается в том, что создаваемые образы одинаковы в разных ОС, так как я отправляю их туда и обратно между моей локальной системой (Windows) и сервером (Linux). Кажется, однако, всякий раз, когда я называю
convert test.jpg -resize 25% test-small.jpg
Процесс создает различные изображения на обеих машинах. Я знаю это, потому что, когда я использую контрольную сумму, значения не совсем совпадают.
Кто-нибудь знает любой причина, по которой это могло произойти? И может быть, каким-то образом обойти это, либо используя другой исполняемый файл, либо передавая параметр, который будет производить те же образы в ОС?
3 ответа:
Файлы содержат больше пикселей - если вы собираетесь сравнивать изображения, напишите контрольную сумму, которая работает только с декодированными пиксельными данными. Это, по крайней мере, скажет вам, будут ли изображения выглядеть одинаково. Внутренние части файла могут отличаться из-за множества факторов.
Изменение размера зависит от арифметики с плавающей точкой, и вы не можете рассчитывать на то, что она будет одинаковой на разных машинах. Таким образом, вместо того, чтобы использовать только контрольную сумму, вы можете посмотреть, если каждый пиксель находится в пределах допуска от связанного в другом файле.
Взгляните на эти ссылки:
Алгоритмы 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" изображение
слева: Изображение с текстом Центр: исходное изображение справа: различия (=текст) красным цветом пикселы.