ImageMagick - как обеспечить минимальную / максимальную высоту / ширину? - PullRequest
12 голосов
/ 06 мая 2010

Используя ImageMagick , как я могу изменить размер изображения, чтобы иметь минимум :

  • высота 150px
  • ширина 200px

и также имеют максимум :

  • высота 225 пикселей
  • ширина 275 пикселей

UPDATE

Если это поможет, вот дальнейшее объяснение того, что я испытываю.

У меня есть набор изображений с разными размерами. Некоторые изображения имеют соотношение высоты и ширины 1: 5. Некоторые имеют соотношение высоты и ширины 5: 1. Итак, я хочу установить минимальный размер высоты / ширины для изображения, но также не хочу, чтобы размер изображения был больше определенного размера.

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

Ответы [ 5 ]

12 голосов
/ 06 мая 2010

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

См. Руководство по параметры геометрии :

Сочетание

widthxheight> Изменяется в соответствии с widthxheight, но только если размер изображения превышает указанный размер.

и

widthxheight ^ Минимальные значения ширины и высоты указаны, соотношение сторон сохранено.

может сделать трюк. Однако для изображений, соотношение сторон которых не соответствует вашим требованиям, я думаю, вам придется создать холст фиксированного размера в IM, залить его каким-нибудь цветом, вставить изображение и сделать на нем trim() ... Возможно, это невозможно все же за один раз.

7 голосов
/ 12 мая 2010

ОК, я делаю похожую обработку. У меня нет универсального решения для произвольных размеров и соотношений сторон, но если ваш входной набор изображений 1: 5 или 5: 1, вы можете сгруппировать их по 2 категориям и обработать соответствующим образом, используя некоторые из этих фрагментов кода.

Шаг 1: определите соотношение сторон изображения и на основании этого установите целевые конечные измененные размеры.

INPATH="path/to/your_file.jpg"
DIMS=`identify "${INPATH}" | awk '{print $3}'`
WIDTH=`echo "${DIMS}"| cut -dx -f1`
HEIGHT=`echo "${DIMS}"| cut -dx -f2`
if (( ${WIDTH} > ${HEIGHT} ));
then
    #file is in landscape orientation
    THUMBDIM="80x60"
    WEBDIM="624x480"
else
    #file is in portrait orientation
    echo -n "(Portrait orientation) "
    THUMBDIM="60x80"
    WEBDIM="480x624"
fi

Шаг 2, выполните фактическое изменение размера:

convert "${INPATH}" -resize "${THUMBDIM}" "resized-${INPATH}"

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

6 голосов
/ 03 августа 2013

Используя ImageMagick, вам нужно всего два mogrify прохода: один, чтобы увеличить те, которые меньше требуемого минимума, и один, чтобы уменьшить те, которые больше максимума. Например, для пакетного изменения размера нескольких файлов JPEG:

mogrify '*.jpg[!200x150<]'
mogrify '*.jpg[!275x225>]'

Первый проход увеличивает те, которые меньше, чем 200x150, а второй сокращает те, которые больше, чем 275x225 (да, знаки верны!). mogrify заменяет исходные изображения, , что вам нужно сделать в этом случае , чтобы избежать повторного изменения размеров изображений при каждом проходе и получения двух обработанных копий.

Даже если они проходят два прохода, вы обрабатываете каждое изображение только один раз (почти, см. Ниже). Первый обрабатывает x % изображений, а другой проход обрабатывает оставшиеся 100- x % (плюс c , см. Ниже), принимая все изображения, необходимые для быть изменены.

! используется для принудительного изменения аспекта для изображений, которые находятся за пределами диапазона (наша константа c ), таких как изображение размером 1200x100, которое не подходит ни для 275x225, ни для 200x150. Эти изображения будут обработаны дважды : на первом проходе аспект ниже диапазона (высота или ширина) будет увеличен до минимума, а на втором проходе другой аспект будет уменьшен до максимума.

Надеюсь, это поможет.

1 голос
/ 06 июня 2013

На основании выше:

#!/bin/bash

FILE="$1"
DIMS=`identify "${FILE}" | awk '{print $3}'`
WIDTH=`echo "${DIMS}"| cut -dx -f1`
HEIGHT=`echo "${DIMS}"| cut -dx -f2`
max_w=2000
max_h=2000

if [[ $HEIGHT -gt $max_h ]]; then
    WIDTH=$(( $WIDTH * $max_h / $HEIGHT ))
    HEIGHT="$max_h"
fi


if [[ $WIDTH -gt $max_w ]]; then
    HEIGHT=$(( $HEIGHT * $max_w / $WIDTH ))
    WIDTH="$max_w"
fi

echo "$FILE ${WIDTH}x${HEIGHT}"
mogrify -filter Lanczos -resize "${WIDTH}x${HEIGHT}" "$FILE"
0 голосов
/ 24 февраля 2012

Вы можете использовать инструмент mogrify , который является частью пакета imagemagick.

Пример использования здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...