Ваш свободный фотоальбом (не совсем проект, но идея с реализацией)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Kopilov
Сообщения: 655
ОС: Gentoo, Debian

Ваш свободный фотоальбом

Сообщение Kopilov » 14.02.2013 02:07

Если вы занимаетесь фото[видео]съёмкой и любите держать в порядке своё творчество, но не любите хранить его в облачных фотохостингах и не срастаетесь ни с одной программой типа digiKam -- давайте попробуем создать удобный и гибкий фотоархив, использовав более примитивные технологии.

Ничего изобретать не будем, возьмём самую обычную файловую систему. Создадим тематические каталоги (например, семья, друзья, город, город/дома, город/машины) и разложим по ним фотографии. Некоторые, при желании, переименуем. Чем не альбом? Именно так выглядел мой фотоальбом с момента покупки цифрового фотоаппарата до момента перехода на GNU/Linux и ещё некоторое время.

Альбом с карточками получился неплохой, но плёнку мы потеряли. Просмотреть все фотографии в том порядке, в котором они были отсняты, уже не получится. Даже если хранить их рядом без каталогизации (тратя в два раза больше места), узнать, что было сфотографировано в тот же день, что и город/дома/дом на Мойке.jpeg будет не просто. Кроме того, часто одни фотографии хочется поместить сразу в несколько каталогов, а другие, наоборот, никуда не пристроить, но и терять жалко.

Что нас спасёт? Конечно, символические ссылки! Итак, идея: создаём каталоги stream и album. В stream копируем файлы с фотоаппарата, сохраняя их оригинальные имена. Чтобы не было коллизий имён и в куче файлов не зависал графический файловый менеджер (вы же не будете просматривать фотографии в консольном?), разложим их по каталогам вида год/фотоаппарат (или иначе, по усмотрению). В album создадим тематические каталоги. Теперь мы можем поместить любую фотографию с плёнок в любой тематический каталог альбома в виде символической ссылки. Просматривая альбом, можно будет любую фотографию найти на плёнке (командой ls -l или readlink) и посмотреть соседние. А просматривая плёнку, можно найти в альбоме все карточки с определённым кадром (командой find -L album -samefile stream/thePhoto).

Идея нравится? Если да -- то переходим к реализации!

Каталоги stream и album у нас уже есть. Создадим ещё каталог new, под новые необработнные фотографии, а в нём -- каталоги с названиями фотоаппаратов.
Придя с очередной фотоохоты, копируем трофеи в new/mycamera. Пересматриваем, удаляем неудачные, фотошопим джимпуем. Есть что склеить? Флаг Hugin вам в руки!
Несмотря на то, что кадры будут сгруппированы по годам, я предпочитаю так же иметь год в их именах (точнее, в именах будущих ссылок), а счётчик в фотоаппарате сбрасываю с наступлением нового года. Для переименования новых кадров есть специальный скрипт:

Код: Выделить всё

#year=2012
year=`date +%Y`
cd new
for camera in *
do
    cd $camera
    for photo in IMG_*; do
        mv $photo IMG_${year}_${photo#IMG_}
    done
    for video in MVI_*; do
        mv $video MVI_${year}_${video#MVI_}
    done
    cd ..
done
Он вставит в имена фотографий и видеороликов текущий (или любой другой) год.

Теперь фотографии пора помещать в архив, но они могут иметь иметь избыточный объём. Сожмём их imagemagick-ом, сохранив оригиналы в каталоге converted:

Код: Выделить всё

#year=2012
year=`date +%Y`
mkdir -p converted
cd new
for camera in *
do
    mkdir -p ../stream/$year/$camera
    mkdir -p ../converted/$year/$camera
    for xpr in {JPG,JPEG,jpg,jpeg,TIF,TIFF,tif,tiff}; do
        for photo in $(ls $camera/*.$xpr); do
            echo $photo
            convert $photo -quality 80 ../stream/$year/${photo%.$xpr}.jpeg
            mv $photo ../converted/$year/$camera
        done
    done
    for video in $(ls $camera/*.MOV); do
        echo $video
        ffmpeg -i $video -s hd720 ../stream/$year/${video%.MOV}.mkv;
        mv $video ../converted/$year/$camera
    done
done
Я выставил качество jpeg 80 и пока не видел, чтобы какая-нибудь фотография заметно пострадала. (Ещё б добавить поиск наиболее ухудшенной!..) Зато сжимаются в 3-4 раза. Видеоролики тоже конвертирую -- вроде бы, в тот же кодек, в котором были отсняты -- но сжимаются они раз в 10 без видимых потерь.

Для раскладывания кадров по каталогам в альбоме я не нашёл ничего лучше Dolphin-а. Он имеет двухпанельный режим и отображение миниатюр, при Drag-n-drop-е предлагает создать ссылку. Очень полезна и интегрированная Konsole.
Ссылки в альбоме должны быть относительными, чтобы его можно было транспортировать. Специально для этого год назад была написана программа relink. Так же она поможет переместить/скопировать ссылку внутри альбома: достаточно сделать её абсолютной, произвести необходимое действие, сделать вновь относительной.

Финальный штрих, которого долго не хватало: поиск кадров, не помещённых в альбом. Основываясь на идее от drBatty, удалось реализовать и его:

Код: Выделить всё

echo 'declare -A isInAlbum' > myalbum
find album -type l -exec readlink {} \; | sed -r 's|(../)*|isInAlbum["|' | sed 's|$|"]="yes"|' >> myalbum
mkdir -p toalbum
pwd=`pwd`
find stream -name "*.*" -exec echo "if [ \"\${isInAlbum['{}']}\" != \"yes\" ]; then ln -s $pwd/{} toalbum; fi"  \; >> myalbum

bash myalbum
rm myalbum
Этот скрипт генерирует временный дочерний со списком фотографий из альбома и проверкой наличия каждой фотографии из плёнок в этом списке. (Если кто-нибудь предложит вариант без временного файла -- рад буду рассмотреть. Мне этого сделать не удалось, поскольку через find -exec можно запустить исполняемый файл, но не команду текущей оболочки (например, присвоение значения переменной).) В итоге у нас появится каталог toalbum, а в нём -- абсолютные ссылки на все фотографии, которых в альбоме ещё нет. Их можно смело перемещать в подходящие тематические каталоги или создавать новые. Не забываем потом выполнить relink -tr album -r!

Все скрипты (я их назвал renameByYear.sh, convert.sh, searchNotAlbumed.sh) рассчитаны на размещение в одном каталоге со stream и album и на запуск из этого каталога. Предполагается отсутствие пробелов в исходных именах фотографий и именах фотоаппаратов. Технология обкатывалась на Canon-G5 и (преиущественно) Canon-600D, у вас могут быть другие особенности именования снимков.

Скрипты распространяются свободно, но без гарантий. При их использовании (и, особенно, доработке) рекомендуется иметь полный бекап фотоархива, а с камеры всё удалять в последнюю очередь.

Желаю удачи в съёмке и организации альбомов!
Кстати, когда будете копировать фотографии из альбома друзьям -- используйте cp -L, чтобы друзьям достались фотографии, а не битые ссылки.
Спасибо сказали:

alex00007
Сообщения: 2
ОС: Debian

Re: Ваш свободный фотоальбом

Сообщение alex00007 » 30.09.2013 18:08

Лаконично. Спасибо.

Изображение
Спасибо сказали:

Аватара пользователя
SLEDopit
Модератор
Сообщения: 4665
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Ваш свободный фотоальбом

Сообщение SLEDopit » 30.09.2013 18:27

А по мне было бы удобнее переименовывать файлы в формате YYYYMMDD_HHMMSS.jpg и сортировать их по директориям как угодно. Вся информация есть в exif, так что технически тут ничего сложного. Таким способом очень удобно склеивать свои фотографии с чужими в хронологическом порядке (при условии, что время на фотоаппаратах совпадает ).
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ваш свободный фотоальбом

Сообщение drBatty » 30.09.2013 19:48

SLEDopit писал(а):
30.09.2013 18:27
А по мне было бы удобнее переименовывать файлы в формате YYYYMMDD_HHMMSS.jpg и сортировать их по директориям как угодно. Вся информация есть в exif,

я не очень понял, где там дата? Выдирал используя этот полезный мануал.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7909
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

Re: Ваш свободный фотоальбом

Сообщение serzh-z » 30.09.2013 19:59

drBatty писал(а):
30.09.2013 19:48
я не очень понял, где там дата?
Для начинающих сеошников: http://www.awaresystems.be/imaging/tiff/ti...meoriginal.html
Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ваш свободный фотоальбом

Сообщение drBatty » 30.09.2013 20:04

serzh-z писал(а):
30.09.2013 19:59
Для начинающих сеошников: http://www.awaresystems.be/imaging/tiff/ti...meoriginal.html

и ВСЕ устройства пишут этот атрибут? А то что-то не вижу такого.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 7909
Статус: Маньяк
ОС: Android, GNU/Linux, Windows

Re: Ваш свободный фотоальбом

Сообщение serzh-z » 30.09.2013 20:14

drBatty писал(а):
30.09.2013 20:04
и ВСЕ устройства пишут этот атрибут? А то что-то не вижу такого.
Разумеется ВСЕ, даже холодильники. "Date/Time Original : 2008:10:15 15:44:26".
Scio me nihil scire.
Спасибо сказали:

Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Ваш свободный фотоальбом

Сообщение drBatty » 30.09.2013 22:20

serzh-z писал(а):
30.09.2013 20:14
Разумеется ВСЕ, даже холодильники. "Date/Time Original : 2008:10:15 15:44:26".

гугл -- найдётся НЕ всё:

Код: Выделить всё

ExifTool Version Number         : 9.27
File Name                       : IMG_20130919_131206.jpg
Directory                       : Downloads
File Size                       : 203 kB
File Modification Date/Time     : 2013:09:19 15:24:39+04:00
File Access Date/Time           : 2013:09:30 18:51:05+04:00
File Inode Change Date/Time     : 2013:09:20 15:51:07+04:00
File Permissions                : rw-r--r--
File Type                       : JPEG
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Exif Byte Order                 : Little-endian (Intel, II)
Software                        : Google
Exif Version                    : 0220
Color Space                     : sRGB
Interoperability Index          : R98 - DCF basic file (sRGB)
Interoperability Version        : 0100
Image Width                     : 1600
Image Height                    : 1200
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1600x1200
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 15764
Статус: grammatikführer
ОС: Debian GNU/Linux

Re: Ваш свободный фотоальбом

Сообщение Bizdelnick » 30.09.2013 22:50

drBatty писал(а):
30.09.2013 22:20

Код: Выделить всё

ExifTool Version Number         : 9.27
File Name                       : IMG_20130919_131206.jpg
Directory                       : Downloads
File Size                       : 203 kB
File Modification Date/Time     : 2013:09:19 15:24:39+04:00
File Access Date/Time           : 2013:09:30 18:51:05+04:00
File Inode Change Date/Time     : 2013:09:20 15:51:07+04:00
File Permissions                : rw-r--r--
File Type                       : JPEG
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Exif Byte Order                 : Little-endian (Intel, II)
Software                        : Google
Exif Version                    : 0220
Color Space                     : sRGB
Interoperability Index          : R98 - DCF basic file (sRGB)
Interoperability Version        : 0100
Image Width                     : 1600
Image Height                    : 1200
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 1600x1200

А тут вообще ничего от фотоаппарата не осталось. Только то, что редактор записал.
Пишите правильно:
в консоли
вкупе (с чем-либо)
в общем
вообще
в течение (часа)
команда
новичок
нюанс
приемлемо
проблема
пробовать
трафик
Спасибо сказали:

NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Ваш свободный фотоальбом

Сообщение NickLion » 01.10.2013 04:47

drBatty, exif с фотика будет намного больше:

> exiftool IMG_5924.JPG | wc -l

175


Это просто мыльница.
Спасибо сказали:

QWERTYASDF
Сообщения: 924
Статус: Чайник со свистком
ОС: GNU/Linux

Re: Ваш свободный фотоальбом

Сообщение QWERTYASDF » 04.08.2014 16:08

Прошу прощения. Я правильно понимаю, что в данной статье не указан факт необходимости самостоятельного указания переменных вроде $year $camera и т.д?...
Спасибо сказали:

Kopilov
Сообщения: 655
ОС: Gentoo, Debian

Re: Ваш свободный фотоальбом

Сообщение Kopilov » 04.08.2014 16:25

Переменная year задаётся автоматически командой date +%Y, при желании этот эффект можно закомментировать и задать год вручную (например, при обработке фотографий из 2014 года после наступления 2015).

Переменная camera берётся из названий подкаталогов new/*. Если у вас несколько камер, и вы хотите помнить (не заглядывая в EXIF), какую фотографию чем снимали -- рекомендуется задавать их осмысленно.
Спасибо сказали: