Небольшой, но полезный скрипт пакетной обработки фото с помощью ImageMagic

    Продолжаю делиться своими наработками в области shell программинга. На сей раз это небольшой скрипт пакетной обработки JPG картинок. Умеет не очень много, но именно то, что надо, а именно:
    * Ресайз фоток
    * Изменение степени сжатия
    * Наложение вотермарка (с помощью composite)

    Не херит EXIF информацию (нужен jhead). Имеет несколько параметров, описание которых можно получить в справке (ключик -h)

    В остальном все просто, но так влом иногда делать простые вещи :) Так что надеюсь кому-то скрипт будет полезен.



    #!/bin/bash
    DIR='.'
    WATERMARK=""
    TARGET_DIR='small'
    RESIZE=2048
    QUALITY=85

    while getopts ":s:t:w:r:q:h" optname
    do
    case $optname in
    "s")
    DIR="$OPTARG"
    DIR=${DIR%/}
    ;;
    "t")
    TARGET_DIR="$OPTARG"
    ;;
    "w")
    WATERMARK="$OPTARG"
    ;;
    "r")
    RESIZE="$OPTARG"
    ;;
    "q")
    QUALITY="$OPTARG"
    ;;
    "h")
    echo "h - help"
    echo "s - source dir"
    echo "t - target dir"
    echo "w - watermark image path"
    echo "r - resize to width or height"
    echo "q - quality"
    exit 0;
    ;;
    *)
    echo "Unknown parameter or option error with option - $OPTARG"
    exit 1;
    ;;
    esac
    done

    FILES=$(find $DIR -type f -name '*.jpg' -or -name '*.JPG' -exec basename '{}' \;)
    mkdir ${TARGET_DIR}

    for FILE in $FILES
    do
    echo "Converting $FILE..."
    convert "${DIR}/${FILE}" -resize $RESIZE -quality $QUALITY "${TARGET_DIR}/${FILE}"
    if [ ! -n $WATERMARK ];
    then
    composite -gravity southeast -dissolve 75 $WATERMARK "${TARGET_DIR}/${FILE}" "${TARGET_DIR}/${FILE}"
    fi
    jhead -te "${DIR}/${FILE}" "${TARGET_DIR}/${FILE}"
    done

    echo 'Everything is done!'
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 3

      0
      У Вас задаётся ошибочное логическое выражение (найти все файлы, включая даже директории и прочие любые, которые оканчиваются на «.JPG» и запустить команду):

      найти_обычные_файлы И найти_*.jpg ИЛИ найти_*.JPG И выполнить_команду
      

      А нужно так:

      найти_обычные_файлы И (найти_*.jpg ИЛИ найти_*.JPG) И выполнить_команду
      

      Выражение:

      find $DIR -type f -name '*.jpg' -or -name '*.JPG' -exec basename '{}' \;
      

      Следует исправить на:

      find $DIR -type f \( -name '*.jpg' -or -name '*.JPG' \) -exec basename {} \;
      
        0
        А вот я немного не понял со строкой if [! -n $WATERMARK ];
        Т.е. расшифровывается она если я не ошибаюсь *говорит смотря в ман* что блок выполняется если строка не пустая (параметр -n). Но тогда зачем стоит "!"? Таким образом блок if выполняется как я понимаю когда пути нет, но composite просто закрывается (не имея пути к файлу), и он не выполняется когда путь есть. O_o
        Вот если заменить на if [ -n $WATERMARK ]; то тогда вотермарк нормально рисуется.
          0
          Скажите, а есть утилиты для автоповорота изображений при отсутствии данных в EXIF (фотоаппарат простенький)? Я понимаю, что тут нужно проводить анализ изображения и 100% точности не достичь, но всё-же?

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое