Adiciona timestamp à imagem da linha de comando do Linux

8

Eu tenho uma pasta cheia de imagens. Eu estou tentando adicionar um timestamp para a imagem em si, para cada imagem, com base na data em que o arquivo foi criado. Isso é possível? Eu li este post aqui , mas ele usa dados exif. Minhas imagens não possuem dados exif.

Posso adicionar diretamente um timestamp usando a data criada? Ou eu tenho que usar dados exif? Se eu tiver que usar dados exif, como eu escreveria usando a data criada?

Estou usando o Ubuntu Server sem GUI, então precisarei de uma solução de linha de comando. Alguém pode ajudar? Obrigado!

    
por Andrew 23.09.2013 / 11:15

3 respostas

15

Se você quiser escrever a data da criação do arquivo de imagem na própria imagem (se não for o que você deseja, por favor edit sua pergunta), você pode usar imagemagick .

  1. Instale o ImageMagick, se ainda não estiver instalado:

    sudo apt-get install imagemagick
    
  2. Execute um loop bash que obterá a data de criação de cada foto e use convert da imagemagick suite para editar a imagem:

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

    Para cada imagem chamada foo.jpg , isso criará uma cópia chamada time_foo.jpg com o registro de data e hora no canto inferior direito. Você pode fazer isso com mais elegância, para vários tipos de arquivos e bons nomes de saída, mas a sintaxe é um pouco mais complexa:

OK, essa foi a versão simples. Eu escrevi um script que pode lidar com situações mais complexas, arquivos em sub-diretórios, nome de arquivo estranho, etc. Tanto quanto eu sei, apenas as imagens .png e .tif podem conter dados EXIF, então não há sentido em executar isso em outros formatos . No entanto, como uma possível solução alternativa, você pode usar a data de criação do arquivo em vez dos dados do EIF. É muito provável que isso não seja o mesmo que a data em que a imagem foi tirada, portanto, o script abaixo tem a seção relevante comentada. Remova os comentários se você quiser processar dessa maneira.

Salve este script como add_watermark.sh e execute-o no diretório que contém seus arquivos:

bash /path/to/add_watermark.sh

Ele usa exiv2 , que você pode precisar instalar ( sudo apt-get install exiv2 ). O script:

#!/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
    
por 23.09.2013 / 12:36
0

Por favor, confira o link para inserir em lote a data / hora do disparo / comentário em uma imagem jpeg em diferentes formatos e idiomas. Uma característica especial é que o carimbo de data é sem perdas. É suportado em Linux e Mac também.

    
por 04.04.2016 / 10:51
0

Basta plotar os arquivos no diretório vazio e canalizar o AWK para o shell. Talvez um pouco oldskool mas muito menos fancypants, muito menos chars para digitar também, por exemplo:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
    
por 08.03.2017 / 23:44