Пакетное изменение размеров картинок в Linux (KDE)

Feb 21, 2008 15:58


UPDATE: Доступна обновленная версия, работающая в KDE4.

В связи с обсуждением на лоре способа массового пережатия картинок, хочу предложить свое решение: фронтэнд к ImageMagik'у, написанный на bash с использованием kdialog (KDE)

Версия для KDE3:

#!/bin/bash

#
# Author: http://yozhek10nozhek.livejournal.com/
# You must keep the link to my LJ when copying this script.
#

[ -z "$PICDIR" ] || unset "$PICDIR"
[ -z "$SMALLPICDIR" ] || unset "$SMALLPICDIR"
[ -z "$EXT" ] || unset "$EXT"
[ -z "$DIFFRES" ] || unset "$DIFFRES"
[ -z "$DESTRES" ] || unset "$DESTRES"
[ -z "$SRCRES" ] || unset "$SRCRES"

EXT="jpg"

PICDIR=`kdialog --title "Выбери папку с картинками" --getexistingdirectory .`
SMALLPICDIR=`kdialog --title "Название папки" --inputbox "Введи название папки, в которую мы будем
складывать уменьшенные картинки.

small - вполне неплохой вариант" "$PICDIR/small"`

cd "$PICDIR"

TOTAL=`ls -1 *.$EXT | wc -l`

# Такая папка уже есть
if [ -d "$SMALLPICDIR" ]
then
if [ -w "$SMALLPICDIR" ]
then
kdialog --title "Вопрос возник" --yesno "Папка $SMALLPICDIR уже существует и доступна для записи. Складывать картинки в нее?"

if [ $? == 0 ] ; then
set > /dev/null # nop
else
kdialog --error "ОК. Тогда я завершаюсь"
exit 1
fi
else
kdialog --error "Папка $SMALLPICDIR существует, но недоступна для записи. Я завершаюсь."
exit 1
fi
fi

mkdir -p "$SMALLPICDIR"

kdialog --title "Текст ниже ;-)" --msgbox "Сейчас мы проверим разрешение всех картинок в папке $PICDIR"

# Проверяем разрешение картинок
dcopCheckRes=`kdialog --progressbar "Нажми Cancel, чтобы прервать" $TOTAL`
dcop $dcopCheckRes showCancelButton true

inc=0
resolutions=".resolutions"

[ -f "$resolutions" ] && rm -f "$resolutions"

touch "$resolutions"

for pic in *.$EXT
do
[ "true" == `dcop $dcopCheckRes wasCancelled` ] && break

res=`identify "$pic" | awk '{print $3}'`

echo "$pic" $res >> "$resolutions"

inc=$((`dcop $dcopCheckRes progress` + 1))
dcop $dcopCheckRes setProgress $inc
done

dcop $dcopCheckRes close

DIFFRES=`cat "$resolutions" | awk '{print $2}' | sort | uniq | wc -l`

if [ $DIFFRES -ge 2 ]
then
kdialog --title "Простите" --sorry "В папке некоторые картинки перевернутые, проверь и поверни их.\nВ следующем окошке будут показаны названия файлов и их разрешения."
kdialog --textbox "$resolutions" 440 500
exit 1
fi

# Пережимаем картинки

DESTRES=`kdialog --title "Введи разрешение для картинок" --inputbox "Укажи разрешение (например, 1024x768):" "1024x768"`
SRCRES=`head -1 "$resolutions" | awk '{print $2}'`

dcopResize=`kdialog --progressbar "Пережимаем картинки (складываем их в папку $SMALLPICDIR)" $TOTAL`
dcop $dcopResize showCancelButton true

inc=0

for pic in *.$EXT
do
[ "true" == `dcop $dcopResize wasCancelled` ] && break

convert -size "$SRCRES" "$pic" -resize "$DESTRES" +profile "*" "$SMALLPICDIR"/"$pic"

inc=$((`dcop $dcopResize progress` + 1))
dcop $dcopResize setProgress $inc
done

dcop $dcopResize close

kdialog --title "OK" --msgbox "Готово!"

cd "$OLDPWD"

exit 0

UPDATE: Обновленная версия для KDE4:

#!/bin/bash

[ -z "$PICDIR" ] || unset "$PICDIR"
[ -z "$SMALLPICDIR" ] || unset "$SMALLPICDIR"
[ -z "$EXT" ] || unset "$EXT"
[ -z "$DIFFRES" ] || unset "$DIFFRES"
[ -z "$DESTRES" ] || unset "$DESTRES"
[ -z "$SRCRES" ] || unset "$SRCRES"

EXT="jpg" # ИЗМЕНИТЕ НА СВОЁ!

PICDIR=`kdialog --title "Выбери папку с картинками" --getexistingdirectory .`
[ $? == 1 ] && exit 0

SMALLPICDIR=`kdialog --title "Название папки" --inputbox "Введи название папки, в которую мы будем
складывать уменьшенные картинки.

small - вполне неплохой вариант" "$PICDIR/small"`
[ $? == 1 ] && exit 0

cd "$PICDIR"

TOTAL=`ls -1 *.$EXT | wc -l`

# Такая папка уже есть
if [ -d "$SMALLPICDIR" ]
then
if [ -w "$SMALLPICDIR" ]
then
kdialog --title "Вопрос возник" --yesno "Папка $SMALLPICDIR уже существует и доступна для записи. Складывать картинки в нее?"

if [ $? == 0 ] ; then
set > /dev/null # nop
else
kdialog --error "ОК. Тогда я завершаюсь"
exit 1
fi
else
kdialog --error "Папка $SMALLPICDIR существует, но недоступна для записи. Я завершаюсь."
exit 1
fi
fi

mkdir -p "$SMALLPICDIR"

kdialog --title "Текст ниже ;-)" --msgbox "Сейчас мы проверим разрешение всех картинок в папке $PICDIR"

# Проверяем разрешение картинок
dbusCheckRes=$(kdialog --title "Проверяем разрешение картинок" --progressbar "Нажми Cancel, чтобы прервать" $TOTAL)
qdbus $dbusCheckRes org.kde.kdialog.ProgressDialog.showCancelButton true

inc=0
resolutions=".resolutions"

[ -f "$resolutions" ] && rm -f "$resolutions"

touch "$resolutions"

for pic in *.$EXT
do
[ "true" == `qdbus $dbusCheckRes org.kde.kdialog.ProgressDialog.wasCancelled` ] && break
res=`identify "$pic" | awk '{print $3}'`

echo "$pic" $res >> "$resolutions"

inc=$((`qdbus $dbusCheckRes org.freedesktop.DBus.Properties.Get org.kde.kdialog.ProgressDialog value` + 1))
qdbus $dbusCheckRes org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog value $inc
done

qdbus $dbusCheckRes org.kde.kdialog.ProgressDialog.close

DIFFRES=`cat "$resolutions" | awk '{print $2}' | sort | uniq | wc -l`

if [ $DIFFRES -ge 2 ]
then
kdialog --title "Простите" --sorry "В папке некоторые картинки перевернутые, проверь и поверни их.\nВ следующем окошке будут показаны названия файлов и их разрешения."
kdialog --textbox "$resolutions" 440 500
exit 1
fi

# Пережимаем картинки

DESTRES=`kdialog --title "Введи разрешение для картинок" --inputbox "Укажи разрешение (например, 1024x768):" "1024x768"`
[ $? == 1 ] && exit 0
SRCRES=`head -1 "$resolutions" | awk '{print $2}'`

dbusResize=$(kdialog --title "Обработка" --progressbar "Пережимаем картинки (складываем их в папку $SMALLPICDIR)" $TOTAL)
qdbus $dbusResize org.kde.kdialog.ProgressDialog.showCancelButton true

inc=0

for pic in *.$EXT
do
[ "true" == `qdbus $dbusResize org.kde.kdialog.ProgressDialog.wasCancelled` ] && break

convert -size "$SRCRES" "$pic" -resize "$DESTRES" +profile "*" "$SMALLPICDIR"/"$pic"

inc=$((`qdbus $dbusResize org.freedesktop.DBus.Properties.Get org.kde.kdialog.ProgressDialog value` + 1))
qdbus $dbusResize org.freedesktop.DBus.Properties.Set org.kde.kdialog.ProgressDialog value $inc
done

qdbus $dbusResize org.kde.kdialog.ProgressDialog.close

kdialog --title "OK" --msgbox "Готово!"

cd "$OLDPWD"

exit 0

Очень удобно для пережатия кучи jpg'ов с фотоаппарата (для выкладывания в интернет или пересылки по почте, когда терять оригиналы с большим разрешением не хочется).

Учтите, однако, что все исходные картинки должны быть одного разрешения (1024x768 и 768x1024 - это не одно и то же).

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

script, bash, kde, linux, pic

Previous post Next post
Up