web-dev-qa-db-ja.com

Linuxコマンドラインから画像にタイムスタンプを追加する

画像でいっぱいのフォルダがあります。ファイルが作成された日付に基づいて、すべての画像について、画像自体にタイムスタンプを追加しようとしています。これは可能ですか?私はこの投稿を読みました here ですが、exifデータを使用しています。画像にexifデータがありません。

作成した日付を使用してタイムスタンプを直接追加できますか?または、exifデータを使用する必要がありますか? exifデータを使用する必要がある場合、作成日を使用してどのように記述しますか?

GUIなしでUbuntu Serverを使用しているので、コマンドラインソリューションが必要になります。誰か助けてもらえますか?ありがとう!

9
Andrew

画像ファイルの作成日を画像自体に書き込みたい場合(それが必要でない場合は、 編集 質問してください)、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という名前のコピーが作成されます。複数のファイルタイプとニース出力名に対して、これをよりエレガントに実行できますが、構文は少し複雑です。

OK、それは単純なバージョンでした。より複雑な状況、サブディレクトリ内のファイル、奇妙なファイル名などを処理できるスクリプトを作成しました。私の知る限り、.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
18
terdon

ファイルを空のディレクトリにプロットし、AWKをシェルにパイプするだけです。たぶん少し古臭いですが、派手なパンツははるかに少なく、入力する文字もはるかに少ないです。例:

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

http://jambula.sourceforge.net/ をチェックして、さまざまな形式と言語のjpeg画像に撮影日/時刻/コメントをバッチ挿入してください。特別な機能は、日付スタンプがロスレスであることです。 LinuxとMacでもサポートされています。

0