Pull to refresh

Пакетное масштабирование изображений

Reading time 3 min
Views 2.8K
Столкнулся с необходимостью масштабирования большого количества фотографий. Конечно, думаю есть и более элегантное решение,
но поскольку гугла под руками не было — быстро набросал фронт к imagemagick на bash. Думаю, кому-то он может пригодиться.

#!/bin/bash

show_help() {
  cat << EOF
Использование:
$0 [ опции ]
Дополнительные опции:
--help вывод этого сообщения
--resource-dir=DIR папка с исходными файлами
--results-dir=DIR папка, в которую складывается результат работы, по умолчанию small
--apportion сохранять пропорции исходных изображений. При наличие этого флага, масштабирование производится по большей стороне.
--resolution=RES Разрешение для создаваемых изображений, или процент. Например, 1024x768 или 45%
EOF
exit 0
}

# инициализация переменных
source_dir=$(pwd);
results_dir="$source_dir/small";
apportion="0";
resolution="0";

# поиск аргумента "Вывести справку"
for param in $@ ;
do
  case $param in --help)
    show_help;;
  esac
done

# разбор строки параметров
for param in $@ ;
do
  case $param in
    --resource-dir=*) source_dir=$( echo $param | cut -d '=' -f 2 ) ;;
    --results-dir=*) results_dir=$( echo $param | cut -d '=' -f 2 ) ;;
    --apportion) apportion="1" ;;
    --resolution=*) resolution=$( echo $param | cut -d '=' -f 2 ) ;;
  esac
done

# поиск ошибок
# проверка на отсутствие аргументов
if test -z "$1"
then
  echo "Аргументы командной строки отсутствуют.";
  show_help;
fi

# проверка на существование resource-dir
if ! [ -d "$source_dir" ]
then
  echo "Директория $source_dir с исходными файлами не существует";
  exit 0;
fi

# проверка на корректность разрешения
if test "$resolution" = "0"
then
  echo "Не указано разрешение.";
  exit 0;
fi

if [ `expr index "$resolution" "x"` = "0" ] && [ `expr index "$resolution" "%"` = "0" ]
then
  echo "Указанное разрешение некорректно";
  exit 0;
fi

if ! [ -x `which identify` ]
then
  echo "Ошибка, приложение identify не найдено";
  exit 0;
fi

if ! [ -x `which convert` ]
then
  echo "Ошибка, приложение convert не найдено";
  exit 0;
fi

# Если папка для измененных изображений не существует, создаем...
if ! [ -d "$results_dir" ]
then
  `mkdir "$results_dir"`;
fi

# собстно, выполнение скрипта
for pic in `ls "$source_dir" | grep -i "jpg"`
do
  file_res=$( identify "$pic" | awk '{print $3}' );
  width=$( echo "$file_res" | cut -d 'x' -f 1 );
  height=$( echo "$file_res" | cut -d 'x' -f 2 );
  if [ `expr index "$resolution" "%"` != "0" ]
  then
    percent=$( echo "$resolution" | cut -d '%' -f 1 );
    n_width=$( echo "$percent*$width/100" | bc | cut -d '.' -f 1 );
    n_height=$( echo "$percent*$height/100" | bc | cut -d '.' -f 1 );
  fi
  if [ `expr index "$resolution" "x"` != "0" ]
  then
    n_width=$( echo "$resolution" | cut -d 'x' -f 1 );
    n_height=$( echo "$resolution" | cut -d 'x' -f 2 );

    #если выбран параметр сохранять пропорции скрипт будет масштабировать по большей стороне
    if [ "$apportion" = "1" ]
    then
      ratio=$( echo "scale=9; $width/$height" | bc );
      if [ "$width" -ge "$height" ]
      then
        n_height=$( echo "$n_width/$ratio" | bc | cut -d '.' -f 1 );
      else
        n_width=$( echo "$n_height*$ratio" | bc | cut -d '.' -f 1 );
      fi
    fi
  fi
  convert -size "$file_res" "$source_dir/$pic" -resize "$n_width"'x'"$n_height" +profile "*" "$results_dir"/"$pic"
  echo "Файл $pic $n_width $n_height";
done


* This source code was highlighted with Source Code Highlighter.

PS: Если скрипту нужно как-нибудь навернуть, прикрутить добавление ватермарка и etc — пишите в комментариях…
PSPS: Критика и более красивые варианты всегда приветствуются…
Tags:
Hubs:
+33
Comments 47
Comments Comments 47

Articles