Добавьте метку времени к изображению из командной строки Linux


9

У меня есть папка, полная изображений. Я пытаюсь добавить временную метку к самому изображению, для каждого изображения, основываясь на дате, когда файл был создан. Это возможно? Я прочитал этот пост здесь , но он использует данные exif. Мои изображения не имеют EXIF ​​данных.

Могу ли я напрямую добавить отметку времени, используя дату создания? Или я должен использовать данные EXIF? Если мне нужно использовать данные exif, как бы я написал их, используя дату создания?

Я использую Ubuntu Server без графического интерфейса, поэтому мне нужно решение для командной строки. Кто-нибудь может помочь? Спасибо!

Ответы:


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, как я мог бы это сделать?
Андрей

@ Андрей, это просто замена строк, смотрите здесь . Он заменит все после последнего .символа .time.$ext( $extрасширение, записанное ранее). Чтобы сделать это time.a.jpg, измените это на ${name/#/time.}.
тердон

-pointsize 48 или -pointsize 72 определенно более разборчивы. :-)
Кори С.

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.