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

    Пролог


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

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

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

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

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

    Посему скрипт. Поэтому я люблю Линукс. Поэтому я люблю 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 осваиваю лишь пару лет, так что комментарии по поводу кода приветствуются.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 12

      +4
      За что я люблю пикасу: для домохозяек у них есть одна кнопка «закачать весь альбом», а для суровых кодеров есть интерфейс, где над закачанным одной кнопкой альбомом можно поработать еще…
        +3
        Мне кажется неразумным, что скрипт по умолчанию что-то там удаляет и куда-то там отсылает. И это всё отключается ключами.
        Имхо, должно быть наоборот, скрипт без ключей причиняет наименьшее изменение…

        А то вон некоторые повадились папки USR удалять.
          0
          Скрипт называется picasa-upload, что намекает, что он «что-то куда-то отсылает». Удаляются же только временные изображения, с надписью.
          +1
          Если бы скрипт еще умел делать таки вложенные альбомы в пикасе… А то корпорация добра упорно не хотят встраивать этот простейший функционал. До сих пор не понимаю, почему
            +2
            «Листинг программы для ЭВМ» — безмерно улыбнуло
            я может не увидел, но всетаки — как то можно добавить флаг, чтобы альбом был закрытый?
              +1
              Скрипт загружает картинки только в существующий альбом, поэтому закрытость/открытость задаётся в самой PicasaWeb.

              Чтобы создавать альбом, нужно использовать google picasa create ... .
              0
              Уже почти год синхронайзю фотки conduit'ом перед этим автоматически обрабатываются (ресайз+копирайт) все фотки скриптом с помощью IM :) от меня лишь требуется положить фотки в нужную папку :)
                0
                На конференции LVEE 2010 Albertas Agejevas из Литвы рассказавал о своем скрипте на Python для закачки изображений на Picasa. Для работы под Windows требует обработки напильником (Альберт в курсе). Размер изображений не меняет, надписи не накладывает.
                  0
                  www.artlebedev.ru/kovodstvo/sections/169/ — как раз про подписи. Совершенно с ним согласен в этом вопросе.
                    0
                    Именно так я изображения и подписываю.
                    +1
                    Скрипт отличный! Он был бы идеальным, если бы ещё мог определять фон, на котором подпись было бы не видно и вставлять туда альтернативную! Но это так, в порядке бреда ;)
                      0
                      Да нет, это не бред, у меня была такая мысль. Лень так заморачиваться было, я не так уж много фоток загружаю.
                      Как вариант можно выполнить надпись на контрастной плашке, хотя в эстетическом плане это не очень.

                    Only users with full accounts can post comments. Log in, please.