Unix-wayBash 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
  • 2329
  • +28
  • 13 января 2012, 23:13
  • 10

Unix-wayПоиск Torrent файлов на различных трекерах в Ubuntu

Torrent Search это программа с открытым исходным кодом, позволяющая пользователям искать Torrent файлы на различных сайтах.





[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 3224
  • +15
  • 06 января 2012, 09:24
  • 7

Unix-wayУстановка Mixxx 1.10 в Linux Ubuntu

Mixxx это свободное программное обеспечение для диджеев, предоставляет все необходимое для создания миксов.

mixxx



[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 1793
  • +19
  • 28 декабря 2011, 09:33
  • 1

Unix-wayПриложение qshutdown для выключения/перезагрузки/гибирнации Linux по заданному времени

Программа основанная на Qt позволяет задать время для выключения, перезагрузки, приостановки или гибирнации.





[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 2137
  • +12
  • 28 декабря 2011, 09:19
  • 10

Unix-wayКак добавить пункт "обновить" в контекстное меню Linux Ubuntu 11.10 (файловый менеджер nautilus)

Скрипт предназначен прежде всего для тех, кто недавно перешел на Ubuntu с Windows. Иногда бывают ситуации, когда некоторые файлы не отображаются на рабочем столе. Для таких случаев существует пункт обновления в контекстное меню (правая кнопка мыши).





[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 3304
  • +14
  • 20 декабря 2011, 04:14
  • 13

Unix-waySkypeTab новое GUI для Skype в Linux

Skype для Linux всегда был сделан не очень качественно в плане GUI. Не то, чтобы это раздражает, однако в версии Windows, интерфейс намного удобнее и приятнее. Сообщество и Никита Цуканов берет дело в свои руки.





[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 2287
  • +14
  • 17 декабря 2011, 12:58
  • 3

Unix-wayGnomeBaker - приложение для прожига CD/DVD в Gnome

Топик для тех, кто ненавидят Brasero с его глюками. Достойная ему альтернатива это приложение GnomeBaker.





[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 1947
  • +9
  • 17 декабря 2011, 12:12
  • 6

Unix-wayУстановка MyPaint в Ubuntu 11.10/11.04/10.10/10.04

MyPaint — быстрый и легкий графический редактор с открытым исходным кодом для рисования.

mypaint

— Доступен для Linux и Windows
— Разработан для рисования на планшетах
— Простой и минималистичный пользовательский интерфейс
— Много инструментов для рисования
— Неограниченный холст (нет необходимости изменять его размеры)
— Поддержка слоев



[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 1923
  • +13
  • 05 декабря 2011, 10:13
  • 3

Unix-wayRemastersys: бекап системы Ubuntu на DVD диск

Remastersys позволяет создавать резервные копии целой системы, включая домашнюю директорию, или только бекапы установленного ПО.

Если нужно записать созданный образ на DVD, он не должен превышать максимальный размер диска, который составляет около 4 Гбайт.



[ Читать дальше... ⇒ ]
  • avatar
  • pashtuun
  • 5591
  • +18
  • 03 декабря 2011, 13:03
  • 11

Unix-wayРелиз легкого и мощного консольного аудио-плеера Peyote 0.9.8

Peyote это аудио-плеер с дружественным консольным интерфейсом. Разработан русским программистом Платоном специально для работы с cue листами. Поддерживает форматы: WV, WAV, FLAC, APE, OGG и MP3.

peyote


[ Читать дальше... ⇒ ]
  • avatar
  • makenskiy
  • 2428
  • +19
  • 26 ноября 2011, 18:30
  • 2