Pull to refresh

Массовое надписывание и загрузка изображений в Picasa Web Albums

Reading time 4 min
Views 1.9K

Пролог


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

Один из самых очевидных способов — добавлять на изображения надпись с указанием вашего веб-сайта, имени, копирайта или копилефта. Для этого домохозяйка откроет любимый графический редактор, выберет инструмент «Текст» и напишет красивыми буквами послание будущим поколениям.

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

Вторая рутинная операция фотографа-блогера-графомана — загрузка изображений на уютный хостинг.

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

Посему скрипт. Поэтому я люблю Линукс. Поэтому я люблю Picasa Web Albums: Google отдал нам на растерзание googlecl — очень простую утилиту для работы с сервисами Корпорации Добра из командной строки (про неё уже кратко рассказывалось на Хабре).

Скрипт очень прост и легко подстраивается под новые неожиданные нужды.


Как пользоваться



Скрипт (назовём его picasa-upload) работает на bash и вызывается следующим образом:
picasa-upload [options] picture_dir [album_name]


Здесь:
  • picture_dir — каталог с изображениями. Скрипт найдёт все изображения с расширениями .jpg и .png, в том числе и во вложенных каталогах.
  • album_name — наименование фотоальбома Picasa Web Albums. Обязателен, если не указано -U.
  • options — любое сочетание следующих опций:
    • -D — не удалять файл с надписанным изображением.
    • -R — не уменьшать изображение до предопределённого размера (полезно, например, для панорам).
    • -U — не загружать изображения в Picasa (например, если вы просто хотите надписать изображения, перед тем, как отдать кому-то). Автоматически подразумевает -D.
    • -s — использовать «маленькую» версию надписи (в случае надписывания небольших изображений).


Например:
picasa-upload -DRs "/home/vassily/Pictures/Отпуск 2011" "Отпуск 2011"


В самом начале скрипта задаются константы: максимальный размер изображения, пути к обычной и «маленькой» надписи и наименование аккаунта в Picasa Web Albums.

Надпись имеет смысл сделать в PNG с прозрачным фоном. Скрипт накладывает её с opacity 90% в правый нижний угол. Всё это можно просто изменить параметрами, указанными для composite.

Требования


  • Необходимо наличие ImageMagick (sudo apt-get install imagemagick, или как у вас там это делается).
  • Необходима установленная googlecl.
  • getopt должен поддерживать параметры с пробелами. Иными словами, getopt -T; echo $? должно вывести ровно 4. Ни больше, ни меньше.


Листинг программы для ЭВМ


Полный код скрипта приведён ниже.

#!/bin/bash
#================================================================================
# Description
#   Script for automated upload of photos to Picasa Web Albums
# Author
#   Dmitry Kann, http://yktoo.com/
# License
#   CC BY-SA 3.0
# Requires
#   ImageMagick
#   googlecl (http://code.google.com/p/googlecl/)
#================================================================================

# Setup vars
pic_size=1600                                                 # Max size of the pictures to upload
file_watermark="$HOME/Pictures/my-watermark.png"              # Watermark file
file_watermark_small="$HOME/Pictures/my-watermark-small.png"  # 'Small' watermark file
picasa_owner="vasily.poupkine"                                # Owner of the Picasa account

#--------------------------------------------------------------------------------
# Functions
#--------------------------------------------------------------------------------

# Logs a message
# Parameters:
#   1 - message
log() {
  echo "$(date +%H:%M:%S)  $1"
}

# Logs a normal message
# Parameters:
#   1 - message
info() {
  log "   $1"
}

# Logs a success message
# Parameters:
#   1 - message
ok() {
  log "+  $1"
}

# Logs a failure message
# Parameters:
#   1 - message
err() {
  log "-  $1"
  exit 1
}

# Displays usage info and exits
# Parameters:
#   1 - error message (if any)
usage() {
  [ -z "$1" ] || log "-  $1"
  cat << EOF
Usage: $0 [options] photos_dir [album_name]
Options:
  -D  Do not delete the photos after uploading (leave them in the source dir)
  -R  Do not resize photos to $pic_size pixels
  -U  Do not upload the photos to Picasa (implies -D)
  -s  Use "small" watermark instead of the default one (more appropriate for smaller images)

album_name is mandatory unless -U is specified.
EOF
  exit 2
}

#--------------------------------------------------------------------------------
# Main routine
#--------------------------------------------------------------------------------

# Parse command line options
b_delete=1
b_resize=1
b_upload=1
s_watermark_to_use="$file_watermark"

args=$(getopt -o DRUs -- "$@")
[ $? -ne 0 ] && usage
eval set -- $args
for i; do
  case "$i" in
    -D)
      b_delete=0
      shift
      ;;
    -R)
      b_resize=0
      shift
      ;;
    -U)
      b_delete=0
      b_upload=0
      shift
      ;;
    -s)
      s_watermark_to_use="$file_watermark_small"
      shift
      ;;
    --)
      shift;
      break
      ;;    
  esac
done

# Parse the rest of the command line
dir_photos="$1"
picasa_album_name="$2"

# Check photos_dir
[ ! -z "$dir_photos" ] || usage "Directory for photos is not specified"
[ -d "$dir_photos" ]   || err "Directory '$dir_photos' does not exist."

# Check album_name
[ $b_upload -eq 0 ] || [ ! -z "$picasa_album_name" ] || usage "Album name is not specified"

[ $b_resize -ne 0 ] && convert_flags="-resize $pic_size"

find "$dir_photos" -type f \( -iname '*.jpg' -o -iname '*.png' \) ! -name '*.picasaweb.*' -print |
  while read src_file; do
    dst_file=${src_file%\.*}.picasaweb.jpg
    info "Processing $src_file -> $dst_file" &&
      # Resize and autorotate the image
      convert $convert_flags -quality 90 -auto-orient "$src_file" "$dst_file" &&
      # Apply watermark
      composite -blend 90% -gravity southeast "$s_watermark_to_use" "$dst_file" "$dst_file" &&
      # Upload the picture
      ( [ $b_upload -eq 0 ] || google picasa post "$picasa_album_name" "$dst_file" --owner "$picasa_owner" ) &&
      # Remove the handled picture
      ( [ $b_delete -eq 0 ] || rm -f "$dst_file" )
  done


Сам я не местный, bash осваиваю лишь пару лет, так что комментарии по поводу кода приветствуются.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+26
Comments 12
Comments Comments 12

Articles