понедельник, января 21, 2008

Пакетное преобразование фотографий

Есть папка с фотографиями с цифровой камеры (JPG, 3072x2048). Необходимо уменьшить все фото для публикации на сайте, например до 1536x1024. Допустим фотографий 50 шт. Можно сделать вручную. Но мы не ходим такими путями :-) Т. к. необходимость уменьшения фоток возникает периодически, для решения задачи был написан маленький скрипт (назовём его conv.sh) с использованием утилиты convert:
#!/bin/sh
for i in $ls./*.jpg $ls./*.JPG
do
if [ -f "$i" ]
then convert "$i" -resize 1536x1024 -quality 85 "$i"
fi
done
Скрипт запускаю в папке с фотографиями, которые нужно преобразовать, просто
$conv.sh
Будьте внимательны: при работе скрипта оригиналы фотографий перезапишутся уменьшенными копиями. Мне так удобнее – я сначала копирую фотки туда, куда мне нужно, а затем запускаю скрипт.

Как сделать по-другому читайте здесь.

При желании скрипт можно расширить для работы с несколькими разрешениями. Получится примерно так:
#!/bin/sh
case "$1" in
1)
size="1152x768"
;;
2)
size="1536x1024"
;;
3)
size="1920x1280"
;;
*)
echo "Script for converting photos to lower dimension --> Usage: conv.sh {1|2|3}"
echo "1 = 1152x768"
echo "2 = 1536x1024"
echo "3 = 1920x1280"
exit 1
esac

for i in $ls./*.jpg $ls./*.JPG
do
if [ -f "$i" ]
then convert "$i" -resize $size -quality 85 "$i"
fi
done
И для моего случая команда будет выглядеть следующим образом:
$conv.sh 2

3 комментария:

Анонимный комментирует...

такой метод имеет кучу плюсов! и мне нравится!
1. баш скрипты пашут очень быстро
2. нет необходимости запускать GUI-приложения

Dmitri комментирует...

у меня при запуске приложения пишет ошибка! не могу прочитать переменную, нет такой переменной ls...
не могли бы вы объяснить подробнее как написан скрипт?

Eugene комментирует...

Заходим в папку с фотографиями и запускаем скрипт. Он обрабатывает поочередно все файлы с расширением jpg и JPG в текущей папке. Если нужны еще какие-то, то необходимо их дописать, например
for i in $ls./*.jpg $ls./*.JPG $ls./*.tif $ls./*.TIFF