Обработка массива изображений в Линукс (ресайз, логотип, подпись)

Сегодня продолжим публикацию статей из цикла “… рано начинать я не планировал, но так сказать жизнь заставила…” речь пойдет о групповой обработки фотографий (массива фотографий), а именно о ресайзе.

Какое решение можно найти? В Линуксе есть множества программ которые с успехом справляются с всем вышеперечисленным мною, я же остановил свой выбор на мультиплатформенной консольной программе Imagemagik, это мощный пакет утилит, с просто гигантским мануалом как минимум страниц на 300, на английском языке. В правдивости моих слов можно убедиться перейдя на страницу самой программы.

Пакет ImageMagick состоит из:

animate – Анимирует последовательность изображений.
composite – Смешивает несколько изображений в одно имеющееся.
convert – Конвертирует изображение между разными форматами.
conjure – Обрабатывает MSL скрипт для создания изображения.
compare – Сравнивает изображение с восстановленным изображением.
display – Показывает изображение.
identify – Описывает формат и характеристики файла изображения.
import – Осуществляет захват окна (скриншот) XWindow.
montage – Монтирует (смешивает) несколько изображений в одно новое.
mogrify – Преобразует требуемое изображение.

Эта программа позволяет автоматизировать процесс обработки массива изображений по средствам использования скриптов (скрипты писать необходимо самому, используя возможности bash’a). Например, можно легко изменить размеры сразу 1000 изображений, а потом проставить на всех логотип, подпись и т.д.

T.е. мы нащелкали на фотокамеру 2 Gb фотографий, всё это скопировали себе на HDD, заливать в интернет фотографии по 3,5 Mb как то обломно, занимает много времени и съедает порой дорогостоящий трафик. Мало того HDD тоже не резиновый, особенно остро это ощущается если фотографируешь много и на профессиональную камеру где фотографии сохраняются с разрешением RAW, вес таких фоток может переваливать за 10Mb на фотку.

Установим программу командой:

sudo aptitude install imagemagick
sudo aptitude install imagemagick

Теперь, непосредственно к механизму работы ImageMagick.
Для изменения размера изображения нам потребуется утилита convert. У неё довольно обширные возможности, однако, нас интересует изменение размера и jepg-качества картинки. Это действие производится с помощью команды:

convert -resize n -quality m исходный-файл.jpg конечный-файл.jpg
convert -resize n -quality m исходный-файл.jpg конечный-файл.jpg

Где n — желаемая ширина в пикселях, например 800×600, а m — желаемое jpeg-качество, например 90. Если вместо конечный-файл.jpg задать исходный-файл.jpg, то утилита преобразует исходный файл и заменит его новой, уменьшенной (или увеличенной) версией.

Для того, чтобы нанести watermark на фотографию, потребуется утилита composite:

composite -gravity northeast -dissolve i знак.jpg исходный-файл.jpg конечный-файл.jpg
composite -gravity northeast -dissolve i знак.jpg исходный-файл.jpg конечный-файл.jpg

Эта команда встроит ваш watermark.png в правый нижний (northeast) угол картинки, прозрачность (точнее, непрозрачность) задаётся значением i. Исходный файл также, как и в случае с предыдущей командой, может быть заменён конечным.

Пример получения скриншота в формате png после трёхсекундной задержки, захватив при этом рамки окон (заголовок, края):

import -pause 3 -frame -screen screenshot.png
import -pause 3 -frame -screen screenshot.png

Следует заметить, что также производится сжатие изображения.

Так же для ресайза массива фотографий можно использовать команду:

mkdir NEW; for f in *.jpg ; do convert -quality 90 -resize 800x600 "$f" "lowres/${f%.jpg}-NEW_PHOTO.jpg" ; done
mkdir NEW; for f in *.jpg ; do convert -quality 90 -resize 800x600 "$f" "lowres/${f%.jpg}-NEW_PHOTO.jpg" ; done

Эта команда: создаёт подкаталог NEW в текущем каталоге (mkdir NEW); далее для всех файлов с разрешением .jpg вызывает программу конвертации.

Программа конвертации сохраняет уменьшенные изображения в подкаталоге NEW под именем с окончанием -800.jpg. Так, если в исходном каталоге были изображения с именами S01924.jpg, S01925.jpg, то после выполнения указанной команды должен появиться подкаталог NEW/ с изображениями S01924-NEW_PHOTO.jpg, S01925-NEW_PHOTO.jpg,

Теперь непосредственно о автоматизации всех вышеперечисленных операций. Для этого мною были написаны 3 разных скрипта, использовать их можно в зависимости от цели или предпочтений пользователя.

Скрипт №1
my_favorite.sh

Тело скрипта:

#!/bin/bash
echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "
 
mkdir NEW_RESIZE_PHOTO; 
for i in *.JPG ; 
do 
echo "Working on $i ..."
convert -quality 90 -resize 800x600 "$i" "NEW_RESIZE_PHOTO/${i%.JPG}-NEW.JPG" ; 
 
done
 
echo " "
echo "... Done!"
echo " "
 
exit 0
#!/bin/bash
echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "

mkdir NEW_RESIZE_PHOTO; 
for i in *.JPG ; 
do 
echo "Working on $i ..."
convert -quality 90 -resize 800x600 "$i" "NEW_RESIZE_PHOTO/${i%.JPG}-NEW.JPG" ; 

done

echo " "
echo "... Done!"
echo " "

exit 0

Как использовать этот скрипт?
Помещаете его в директорию с фотографиями и запускаете командой:

sh my_favorite.sh
sh my_favorite.sh

Что делает это скрипт?
В текущей директории создает новую папку с именем NEW_RESIZE_PHOTO и складывает в нее готовые (перересайзенные) копии фотографий, добавляя к имени приставку -NEW.
Качество = 90
Разрешение = 800х600

Скрипт №2
inside.sh

Тело скрипта:

!/bin/bash
echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "
 
for i in *.JPG; 
do 
echo "Working on $i ..."
mogrify -resize 800 $i; done
 
echo " "
echo "... Done!"
echo " "
 
exit 0
!/bin/bash
echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "

for i in *.JPG; 
do 
echo "Working on $i ..."
mogrify -resize 800 $i; done

echo " "
echo "... Done!"
echo " "

exit 0

Как использовать этот скрипт?
Помещаете его в директорию с фотографиями и запускаете командой:

sh inside.sh
sh inside.sh

Что делает это скрипт?
В текущей директории ресайзит все фотографии с разрешением *.JPG

Скрипт №3
gilbert.sh

Тело скрипта:

!/bin/bash
WATERMARK="/home/booch/watermark.png"
 
echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "
 
for i in *.JPG ;
do
echo "Working on $i ..."
convert -adaptive-resize 1024x1024 -quality 90 $i $i 2> /dev/null
composite -gravity southeast -dissolve 75 $WATERMARK $i $i 2> /dev/null
done
 
echo " "
echo "... Done!"
echo " "
 
exit 0
!/bin/bash
WATERMARK="/home/booch/watermark.png"

echo " "
echo "--==Created by Alex Berber==--"
echo  "--===www.linuxspace.org==--"
echo " "

for i in *.JPG ;
do
echo "Working on $i ..."
convert -adaptive-resize 1024x1024 -quality 90 $i $i 2> /dev/null
composite -gravity southeast -dissolve 75 $WATERMARK $i $i 2> /dev/null
done

echo " "
echo "... Done!"
echo " "

exit 0

Как использовать этот скрипт?
Помещаете его в директорию с фотографиями и запускаете командой:

sh gilbert.sh
sh gilbert.sh

Что делает это скрипт?
Скрипт использует для обработки фотографий сразу две программы, это convert, composite.
convert — Непосредственно производит конвертирование фотографий.
composite — Накладывает водяной знак на ваши фотографии.

Готовые скрипты можно скачать введя в терминале команду:

wget http://www.linuxspace.org/wp-content/uploads/2008/files/{gilbert.sh,inside.sh,my_favorite.sh}
wget http://www.linuxspace.org/wp-content/uploads/2008/files/{gilbert.sh,inside.sh,my_favorite.sh}