Столкнулся с необходимостью масштабирования большого количества фотографий. Конечно, думаю есть и более элегантное решение,
но поскольку гугла под руками не было — быстро набросал фронт к imagemagick на bash. Думаю, кому-то он может пригодиться.
PS: Если скрипту нужно как-нибудь навернуть, прикрутить добавление ватермарка и etc — пишите в комментариях…
PSPS: Критика и более красивые варианты всегда приветствуются…
но поскольку гугла под руками не было — быстро набросал фронт к 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: Критика и более красивые варианты всегда приветствуются…