В чем разница между операциями sample/resample/scale/resize/adaptive-resize/thumbnail в ImageMagick convert?

Я нашел несколько способов изменить разрешение изображения с помощью convert:

-sample
-resample
-scale
-resize
-adaptive-resize
-thumbnail

В чем разница?

Если мне нужно сделать миниатюру большого размера большого размера с фиксированным соотношением сторон (требуется обрезка) - какой мой лучший выбор?

Ответ 1

изменить размер

-resize 400x300+20+30 (например, примеры -scale и -sample) преобразует входной сигнал в выходное изображение, которое имеет размеры пикселей 400x300. Он также сдвигает выход на 20 пикселей вправо и на 30 пикселей вниз. Кроме того, существует несколько отличий от -scale:

  • -resize поддерживает дополнительную настройку -filter (которая должна встречаться в командной строке перед использованием -resize!).

  • -filter определяет точный алгоритм, который будет использоваться для цветов добавленных пикселей в случае увеличения или для цветов, которые будут использоваться для остальных пикселей, когда некоторые из их соседей будут удалены в случае минимизации.

  • Для списка поддерживаемых фильтров просто запустите convert -list filter.

  • -filter point -resize 400x300 создает точно такой же результат, что и -sample 400x300, но он работает еще медленнее.

  • Если не задано рядом (до) -resize, то преобразование будет по умолчанию равно -filter Lanczos, которое будет медленнее, но которое дает гораздо лучшее качество (поскольку оно учитывает цвета всех окружающих пикселей для все новые), чем -filter point производит (который использует правило ближайшего соседа для определения цвета вновь добавленных пикселей).

образец

-sample 400x300 преобразует входное изображение в выходные изображения с размерами пикселя 400x300. Однако есть несколько очень важных отличий от -resize:

  • -sample не поддерживает дополнительную настройку -filter; если все равно, то -filter просто игнорируется.

  • При увеличении (поскольку размер входного изображения может быть меньше, чем 400x300), пиксели реплицируются в блоках.

  • При минировании (поскольку размер входного изображения может быть больше, чем 400x300), пиксели субсэмплируются с помощью очень простого алгоритма: некоторые строки и столбцы просто пропускаются.

  • Аргумент геометрии для -sample не поддерживает какую-либо смещенную часть (в отличие от -resize, которая соответствует директивам смещения для вывода).

  • На выходе никогда не будет больше (разных) цветов, чем у исходного изображения; у него может быть меньше цветов.

  • Поэтому -sample работает очень быстро (быстрее, чем -resize), но качество вывода (обычно) хуже: вы можете легко получить экстремальный blocking и aliasing в результирующем выходе.

  • Одна из важных особенностей -sample заключается в том, что новое изображение не будет содержать никаких новых цветов, хотя некоторые цвета исходного изображения могут исчезнуть.

resample

-resample использует в качестве параметра желаемое XxY разрешение, а не XxY пиксель геометрия целевого изображения. Целью этого оператора является сохранение отображаемого размера изображения: предположим, что ваше изображение измеряет 4 дюйма на 3 дюйма на устройстве, которое отображает его при 300 DPI. Затем запрос на -resample 72 или -resample 72x72 изменит размер изображения так, чтобы он измерял (снова) 4 дюйма на 3 дюйма на устройстве с 72 DPI.

  • Эта операция работает только для таких изображений, которые уже имеют желаемое разрешение, хранящееся в их метаданных (не все форматы изображений поддерживают концепцию разрешения изображения - JPEG, PNG и TIFF).

  • Если исходное изображение находится в формате, где отсутствует внутренняя поддержка разрешения изображения, то (предполагаемое) исходное разрешение изображения должно быть указано через -density в командной строке до указания -resample.

шкала

-scale 400x300 создает эквивалентный результат (но быстрее, потому что он избегает всей обработки фильтра), как и при использовании -filter box -resize 400x300. Он также полностью игнорирует любую текущую настройку -filter.

  • При минировании он изменяет размер изображения просто путем замены цветов пикселей путем усреднения соответствующих цветов входного пикселя вместе.

  • При увеличении он просто реплицирует соответствующие входные пиксели для требуемых дополнительных пикселей.

адаптивное изменение размера

-adaptive-resize 400x300 не поддерживает (или игнорирует, если задано) смещение части параметра геометрии, а также игнорирует параметр -gravity, если он присутствует.

  • Он использует по умолчанию зависящую от данных триангуляцию при изменении размера (если метод изменения размера не переопределяется дополнительным указанием -filter [something]).

thumbnail

-thumbnail работает так же, как -resize, имеет несколько отличий:

  • Он оптимизирован для скорости.

  • Он также удаляет любые встроенные цветовые профили, чтобы уменьшить размер файлов эскизов.


Следующий ответ показывает несколько (иллюстрированных!) примеров директивы -resize. На каждой иллюстрации показан другой результат, в зависимости от "мелких деталей" точного метода изменения размера: