Unix-way → Bash scripts: nautilus - пакетный ресайзинг изображений

Утилита может пригодится web-разработчикам да и просто в быту. Скрипт, используя возможности ImageMagic, изменяет размер изображений на заданный пользователем в пакетном режиме и сохраняет их во вложенную папку, не изменяя исходных файлов. Можно также добавить текстовую подпись на все изображения. Картинка не изменяет пропорций и, при их несоответствии заданным размерам, выполняется либо ресайз по наименьшей стороне с подрезкой «излишков» либо ресайз по наибольшей стороне с добавлением черных полей.
Скрипт может работать как автономно так и дополнением к менеджеру файлов Nautilus.

deb-пакет добавляет команду resizer в /usr/bin и ссылку на него в Nautilus->Сценарии->Пакетное изменение размера изображений

Исходник
#!/bin/bash
# resizer - Multi Picture Resizer - nautilus script
# written by Conquistador

TFN="/tmp/tmp$$" # temporary file
TFN1="${TFN}-1"
FTR="*.png *.PNG *.jpg *.JPG" # фильтры для zenity --file-selection
FTM="png|jpg" # фильтры для собственных циклов
BGRDCLR=black # цвет фона
TXTCLR=blue # цвет текста
QUALITY=92 # качество сжатия

error() # вывод ошибки -> выход
{
zenity --info --title="Ё-маё!" --text="Ошибка: ${1}!" --timeout=5;
if [ -f ${TFN} ];then rm -f ${TFN};fi
if [ -f ${TFN1} ];then rm -f ${TFN1};fi
exit 1
}

if [ -z "$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" ]; then
	NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=$(zenity --file-selection --multiple --file-filter="${FTR}" --filename="${HOME}" --title="Выбери файлы")
	if [ -z "${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}" ];then error "ничего не выбрано"; fi
	IFS=$'|'
else
	IFS=$'\n'
fi
echo -n > "$TFN"
max=0
for name in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
	echo "$(basename ${name})" >> "$TFN"
	if [ $max -eq 0 ];then folder="$(dirname ${name})";fi
	let max++	
done
unset IFS

# Корректирую список - фильтрую файлы и удаляю пустые строки.
echo -n > "$TFN1"
IFS=$'|'
for e in ${FTM}; do cat "${TFN}" | grep -i .$e >> "$TFN1"; done
unset IFS
sed -i '/^$/d' "$TFN1"
max=$(cat "$TFN1"| wc -l)
[ $max -eq 0 ] && error "нет файлов-изображений для обработки!"

# Спрашиваю размер
_x=$(xrandr | sed -n 's/.\{0,\}current \([0-9]\{1,\}\) x [0-9]\{1,\}.\{0,\}/\1/g;p;q')
_y=$(xrandr | sed -n 's/.\{0,\}current [0-9]\{1,\} x \([0-9]\{1,\}\).\{0,\}/\1/g;p;q')
res=$(zenity --entry --entry-text="${_x}x${_y}" --title="Размер изображений" --text="Введи требуемый размер изображений (например 320x240):")
if [ -z ${res} ]; then error "не выбран размер";fi
res=${res//[X ч Ч х Х \[]/x} # Корректирую сепаратор
if [ "x$(echo ${res} | grep "x")" = "x" ];then error "неверный ввод";fi
width=$(echo "$res" | cut -d"x" -f1 -s) # проверка на пустые значения
height=$(echo "$res" | cut -d"x" -f2 -s)
if [ -z ${width} ] || [ -z ${height} ];then error "не указан один из параметров размера"; fi
geometry=$res

_ext=''
zenity --text="При несоответствии пропорций..." --title="Пропорции" --ok-label="Обрезать изображение" --cancel-label="Добавить пустые поля" --question && _ext='^'

# Спрашиваю автограф
agph=$(zenity --entry --entry-text="Conquistador ™" --title="Автограф" --text="Введи текст подписи, если не нужно оставь поле пустым или нажми - отмена")
if [ $? -ne 0 ]; then agph=""; fi

dist_folder="${folder}/${geometry}"
mes="Всего к обработке: $max файла(ов)\n\
Выбрана папка: ${folder}\n\
Целевая папка: ${dist_folder}\n\
Выбранный размер: ${geometry}
Автограф: ${agph}"
res=0
zenity --text="$mes" --title="Все верно?" --ok-label="Начать" --cancel-label="Отменить" --question && res=1
if [ $res -eq 0 ];then error "отменено"; fi

# Создаю целевую папку
[ -d "${dist_folder}" ] || mkdir ${dist_folder}

# Обнуляю счетчик для прогресс-бара
count=0;
IFS=$'\n'
for i in $(cat "$TFN1"); do
	echo "# Обрабатываю: ${i}"
	# создаю новое имя файла удаляя старый и добавляя новый
	# суффикс ШИРИНАxВЫСОТА и заменяя пробелы на символы подчеркивания
	separator="x X х Х"
	new_name=${i//[- _][0-9][0-9][0-9][0-9][$separator][0-9][0-9][0-9][0-9]/}
	if [ "$new_name" = "$i" ];then
	  new_name=${i//[- _][0-9][0-9][0-9][0-9][$separator][0-9][0-9][0-9]/}
	  if [ "$new_name" = "$i" ];then
	    new_name=${i//[- _][0-9][0-9][0-9][$separator][0-9][0-9][0-9]/}
	    if [ "$new_name" = "$i" ];then
	      new_name=${i//[0-9][0-9][0-9][0-9][$separator][0-9][0-9][0-9][0-9]/}
	      if [ "$new_name" = "$i" ];then
		new_name=${i//[0-9][0-9][0-9][0-9][$separator][0-9][0-9][0-9]/}
		if [ "$new_name" = "$i" ];then
		  new_name=${i//[0-9][0-9][0-9][$separator][0-9][0-9][0-9]/}
	fi fi fi fi fi
	new_name="$(echo ${new_name// /_} | sed 's/\(.*\)\(\....\)/\1-'$geometry'\2/')"

	# Собственно конвертирование картинок
	if [ "x${agph}" = "x" ]; then
		convert "${folder}/${i}" -resize ${geometry}${_ext} -background ${BGRDCLR} -compose Copy -gravity Center -extent ${geometry} -quality ${QUALITY} "${dist_folder}/${new_name}"
	else
		convert "${folder}/${i}" -resize ${geometry}${_ext} -background ${BGRDCLR} -compose Copy -gravity Center -extent ${geometry} -font URW-Palladio-Bold-Italic -gravity South -fill ${TXTCLR} -pointsize 20 -annotate +5+5 "${agph}" -quality ${QUALITY} "${dist_folder}/${new_name}"
	fi
	if [ $? -ne 0 ]; then
		echo "# Ошибка!!!\tНе могу обработать: ${i}"
		sleep 4
	fi    
	let count++
	echo $(($count * 100 / $max))
done | zenity --progress --width=500 --title="Изменение размера $max файла(ов)" --auto-close --auto-kill --percentage=0
unset IFS

rm -f ${TFN} ${TFN1} # удаляю временные файлы
nautilus "${dist_folder}"&
exit 0
  • avatar
  • terra
  • 2335
  • +28
  • 13 января 2012, 23:13

Комментариум (10)

RSS свернуть / развернуть
+
+2
avatar

pashtuun

  • 14 января 2012, 11:13

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Спасибо! Я с ваших постов просто в экстазе! Если бы серию статей о баше я бы кончил )))
+
+3
avatar

terra

  • 14 января 2012, 12:42

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Что-бы писать статьи о баше нужно быть каким-нить профессором универа. Но в тырнете и без того очень много материала о языке командной оболочки, вот к примеру: www.opennet.ru/docs/RUS/bash_scripting_guide/
+
+4
avatar

Sfate

  • 14 января 2012, 16:01

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Что-бы писать статьи о баше нужно быть каким-нить профессором универа.
Что? Извините, но откуда такие мысли?
Чтобы писать «на баше» и «о баше» нужно просто иметь прямые руки и знание синтаксиса ;)
+
+3
avatar

terra

  • 14 января 2012, 16:24

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Писать несистематизированную байду про десяток команд и прямые руки как минимум снобство. Одних только интерпретаторов с десяток и то, что работает в dash не всегда заработает в bash не говоря уж о sh! Про команды sed awk… пакеты imagemagic, mencoder, ffmpeg… и их параметры вообще надо отдельные глыбы-тома создавать! Поэтому я и привожу рабочие скрипты которые можно реально тыкать, менять команды и параметры потихоньку осваивая и применяя на практике скриптовые программки.
+
+6
avatar

Sfate

  • 14 января 2012, 16:34

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Эм… ткните пожалуйста, где я сказал, что в вашей статье, что то не так… или усомнился в вашем уровне владением 'написания скриптов'?

Просто ваша фраза про «профессора» меня задела.
Если человек не имеет ученой степени, то это не значит, что он не сможет чего то ;)
+
Я уж точно знаю, что бородатые мужички, в свитерах с пингвином, напишут скрипт на баше куда лучше, и прости боже, кроссбашевее.
+
0
avatar

pashtuun

  • 15 января 2012, 11:55

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
И на том спасибо
+
+1
avatar

Anonymous

  • 15 января 2012, 16:10

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
А есть скриптик или програма для пакетного конвертирования изображений допусьтим из tiff в jpeg ?
+
+4
avatar

terra

  • 16 января 2012, 04:14

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Не проверял, но думаю ImageMagic tiff схавает, просто добавь в «шапке» соответствующие фильтры и принудительно измени расширение целевых файлов с tiff на jpg, добавив после строки:
new_name="$(echo ${new_name// /_} | sed 's/\(.*\)\(\....\)/\1-'$geometry'\2/')"

строчку:
new_name=${new_name//tiff/jpg}
+
-2
avatar

Anonymous

  • 23 января 2012, 16:00

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Стремление сделать скрипт с ГУЕМ его всегда только утяжеляет. Брось это, все равно никто не оценит, дал пару команда и все. Нормальным людям ГУЙ не нужен, а тем кому нужен не нужен этот скрипт. Все просто...
+
+1
avatar

terra

  • 01 апреля 2012, 12:12

  • Warning: Smarty error: unable to read resource: "cmtedit_button.tpl" in /home/m/makenskiy/itbuben.org/public_html/engine/lib/external/Smarty-2.6.19/libs/Smarty.class.php on line 1092
Именно в применении скриптов для улучшения удобства работы и состоит философия unix-way, а не мазо-тру-ебли в консоли!

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