Tambahkan cap waktu ke gambar dari baris perintah Linux


9

Saya memiliki folder yang penuh dengan gambar. Saya mencoba menambahkan cap waktu ke gambar itu sendiri, untuk setiap gambar, berdasarkan tanggal saat file dibuat. Apakah ini mungkin? Saya sudah membaca posting ini di sini , tetapi menggunakan data exif. Gambar saya tidak memiliki data exif.

Bisakah saya langsung menambahkan stempel waktu menggunakan tanggal yang dibuat? Atau apakah saya harus menggunakan data exif? Jika saya harus menggunakan data exif, bagaimana saya menulisnya menggunakan tanggal yang dibuat?

Saya menggunakan Server Ubuntu tanpa GUI, jadi saya akan membutuhkan solusi baris perintah. Adakah yang bisa membantu? Terima kasih!

Jawaban:


18

Jika Anda ingin menulis tanggal pembuatan file gambar ke dalam gambar itu sendiri (jika bukan itu yang Anda inginkan, harap edit pertanyaan Anda), Anda dapat menggunakan imagemagick.

  1. Instal ImageMagick jika belum diinstal:

    sudo apt-get install imagemagick
    
  2. Jalankan bash loop yang akan mendapatkan tanggal pembuatan setiap foto dan gunakan convertdari imagemagicksuite untuk mengedit gambar:

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

    Untuk setiap gambar bernama foo.jpg, ini akan membuat salinan yang disebut time_foo.jpgdengan cap waktu di kanan bawah. Anda dapat melakukan ini dengan lebih elegan, untuk beberapa jenis file dan nama output yang bagus tetapi sintaksnya sedikit lebih kompleks:

OK, itu versi sederhana. Saya menulis sebuah skrip yang dapat menangani situasi yang lebih kompleks, file dalam sub direktori, nama file aneh dll. Sejauh yang saya tahu, hanya gambar .png dan .tif yang dapat berisi data EXIF ​​sehingga tidak ada gunanya menjalankan ini pada format lain . Namun, sebagai solusi yang memungkinkan Anda dapat menggunakan tanggal pembuatan file alih-alih data EIF. Ini sangat mungkin tidak sama dengan tanggal pengambilan gambar sehingga skrip di bawah ini memiliki bagian yang relevan berkomentar. Hapus komentar jika Anda ingin memprosesnya dengan cara ini.

Simpan skrip ini sebagai add_watermark.shdan jalankan di direktori yang berisi file Anda:

bash /path/to/add_watermark.sh

Menggunakan exiv2yang Anda mungkin perlu menginstal ( sudo apt-get install exiv2). Naskah:

#!/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

Inilah yang saya cari! Namun, saya mendapatkan output berikut: 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.Juga, saya belum memutuskan apakah saya ingin menggunakan subdirektori; Bisakah Anda menunjukkan cara menggunakan findjuga? Terima kasih!
Andrew

@Andrew ada dua masalah yang mungkin, satu adalah bahwa saya belum mengutip variabel dengan benar dan spasi dalam nama file akan menyebabkan masalah. Coba skrip dalam jawaban yang diperbarui. Jika masih gagal, gambar Anda mungkin tidak berisi data EXIF ​​yang diperlukan, saya telah menyertakan solusi (buruk) untuk itu.
terdon

Sudah lama, tetapi bisakah Anda menjelaskan apa "$path"/"${name/%.*/.time.$ext}"? Khususnya, /%.*/bagian. Juga, jika saya ingin menempatkan bagian "waktu" di depan, misalnya time.a.jpg daripada a.time.jpg, bagaimana saya bisa melakukannya?
Andrew

@Andrew itu hanya penggantian string, lihat di sini . Ini akan menggantikan semuanya setelah .karakter terakhir dengan .time.$ext( $extadalah ekstensi ditangkap sebelumnya). Untuk membuatnya time.a.jpg, ubah itu menjadi ${name/#/time.}.
terdon

-pengukuran 48 atau -pengukuran 72 tentu lebih mudah dibaca. :-)
Corey S.


0

Cukup plot file ke direktori kosong, dan pipa AWK ke shell. Mungkin sedikit oldskool tetapi jauh lebih sedikit fancypants, karakter yang jauh lebih sedikit untuk mengetik juga, misalnya:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.