Додайте позначку часу до зображення з командного рядка Linux


9

У мене папка, повна зображень. Я намагаюся додати часову позначку до самого зображення для кожного зображення, виходячи з дати створення файлу. Чи можливо це? Я читав цю публікацію тут , але вона використовує exif дані. Мої зображення не мають exif даних.

Чи можу я безпосередньо додати часову позначку за допомогою створеної дати? Або мені потрібно використовувати дані exif? Якщо мені доведеться використовувати дані exif, як би я записав їх за допомогою створеної дати?

Я використовую Ubuntu Server без GUI, тому мені знадобиться рішення командного рядка. Хтось може допомогти? Дякую!

Відповіді:


18

Якщо ви хочете записати дату створення файлу зображення у самому зображенні (якщо це не те, що ви хочете, відредагуйте своє запитання), ви можете використовувати imagemagick.

  1. Встановіть ImageMagick, якщо він ще не встановлений:

    sudo apt-get install imagemagick
    
  2. Запустіть цикл bash, який отримає дату створення кожної фотографії та використовуйте convertз imagemagickнабору для редагування зображення:

    for img in *jpg; do convert "$img" -gravity SouthEast -pointsize 22 \
       -fill white -annotate +30+30  %[exif:DateTimeOriginal] "time_""$img"; 
    done
    

    Для кожного названого зображення foo.jpgце створить копію, яку називають time_foo.jpgчасовою позначкою в нижній правій частині. Ви можете зробити це більш елегантно, для декількох типів файлів і хороших вихідних імен, але синтаксис є трохи складнішим:

Гаразд, це була проста версія. Я написав сценарій, який може вирішувати складніші ситуації, файли в підкаталогах, дивні назви файлів тощо. Наскільки я знаю, лише .png і .tif зображення можуть містити EXIF-дані, тому немає сенсу запускати це в інших форматах . Однак, як можливе вирішення, ви можете використовувати дату створення файлу замість даних EIF. Це, швидше за все, не є датою зйомки зображення, хоча сценарій нижче містить відповідний розділ. Видаліть коментарі, якщо ви хочете, щоб це було оброблено таким чином.

Збережіть цей сценарій як add_watermark.shі запустіть його в каталозі, який містить ваші файли:

bash /path/to/add_watermark.sh

Він використовує, exiv2що вам може знадобитися для встановлення ( sudo apt-get install exiv2). Сценарій:

#!/usr/bin/env bash

## This command will find all image files, if you are using other
## extensions, you can add them: -o "*.foo"
find . -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.tif" -o \
 -iname "*.tiff" -o -iname "*.png" | 

## Go through the results, saving each as $img
while IFS= read -r img; do
    ## Find will return full paths, so an image in the current
    ## directory will be ./foo.jpg and the first dot screws up 
    ## bash's pattern matching. Use basename and dirname to extract
    ## the needed information.
    name=$(basename "$img")
    path=$(dirname "$img")
    ext="${name/#*./}"; 

    ## Check whether this file has exif data
    if exiv2 "$img" 2>&1 | grep timestamp >/dev/null 
    ## If it does, read it and add the water mark   
    then
    echo "Processing $img...";
    convert "$img" -gravity SouthEast  -pointsize 22 -fill white \
             -annotate +30+30  %[exif:DateTimeOriginal] \
             "$path"/"${name/%.*/.time.$ext}";
    ## If the image has no exif data, use the creation date of the
    ## file. CAREFUL: this is the date on which this particular file
    ## was created and it will often not be the same as the date the 
    ## photo was taken. This is probably not the desired behaviour so
    ## I have commented it out. To activate, just remove the # from
    ## the beginning of each line.

    # else
    #   date=$(stat "$img" | grep Modify | cut -d ' ' -f 2,3 | cut -d ':' -f1,2)
    #   convert "$img" -gravity SouthEast  -pointsize 22 -fill white \
    #          -annotate +30+30  "$date" \
    #          "$path"/"${name/%.*/.time.$ext}";
    fi 
done

Це саме те, що я шукаю! Однак я отримую такий результат: convert.im6: unknown image property "%[exif:DateTimeOriginal]" @ warning/property.c/InterpretImageProperties/3245. convert.im6: unable to open image `{img/%.*/.time.jpg}': No such file or directory @ error/blob.c/OpenBlob/2638.Також я ще не вирішив, чи хочу ще використовувати підкаталоги; Ви могли б показати, як користуватися find? Дякую!
Андрій

@Andrew є дві можливі проблеми, одна полягає в тому, що я не цитував змінні належним чином, і тому пробіли в іменах файлів можуть викликати проблеми. Спробуйте сценарій в оновленій відповіді. Якщо це все ще не вдається, ваші зображення, ймовірно, не містять необхідних даних EXIF, я включив для цього (поганий) спосіб.
тердон

Минув час, але чи можете ви пояснити, що "$path"/"${name/%.*/.time.$ext}"робить? Зокрема, /%.*/частина. Крім того, якщо я хотів би поставити частину "час" попереду, наприклад, time.a.jpg, а не a.time.jpg, як я можу це зробити?
Андрій

@Andrew - це лише заміна рядків, дивіться тут . Він замінить все після останнього .символу на .time.$ext( $extє розширення, записане раніше). Щоб зробити це time.a.jpg, змініть це на ${name/#/time.}.
terdon

-значити 48 або -значити 72, безумовно, є більш розбірливим. :-)
Corey S.

0

Будь ласка, перегляньте http://jambula.sourceforge.net/, щоб партія вставити дату / час зйомки / прокоментувати зображення jpeg у різних форматах та мовах. Особливістю є те, що штамп дати без втрат. Він також підтримується на Linux та Mac.


0

Просто розмістіть файли в порожній каталог і передайте AWK в оболонку. Можливо, трохи oldskool, але набагато менше фантазійних штанів, набагато менше знаків для набору, наприклад:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.