เพิ่มการประทับเวลาให้กับรูปภาพจากบรรทัดคำสั่ง Linux


9

ฉันมีโฟลเดอร์ที่เต็มไปด้วยภาพ ฉันพยายามเพิ่มการประทับเวลาลงบนภาพสำหรับทุก ๆ ภาพตามวันที่สร้างไฟล์ เป็นไปได้ไหม ฉันได้อ่านโพสต์นี้ที่นี่แต่ใช้ข้อมูล exif รูปภาพของฉันไม่มีข้อมูล exif

ฉันสามารถเพิ่มการประทับเวลาโดยตรงโดยใช้วันที่ที่สร้างขึ้นได้หรือไม่ หรือฉันต้องใช้ข้อมูล exif ถ้าฉันต้องใช้ข้อมูล exif ฉันจะเขียนมันอย่างไรโดยใช้วันที่สร้างขึ้น?

ฉันใช้เซิร์ฟเวอร์ Ubuntu โดยไม่มี GUI ดังนั้นฉันจะต้องใช้โซลูชันบรรทัดคำสั่ง ใครช่วยได้บ้าง ขอบคุณ!

คำตอบ:


18

หากคุณต้องการที่จะเขียนวันที่สร้างไฟล์ภาพที่เป็นภาพของตัวเอง (ถ้านั่นไม่ใช่สิ่งที่คุณต้องการโปรดแก้ไขคำถามของคุณ) imagemagickคุณสามารถใช้

  1. ติดตั้ง ImageMagick หากยังไม่ได้ติดตั้ง:

    sudo apt-get install imagemagick
    
  2. เรียกใช้ bash loop ที่จะได้รับวันที่สร้างภาพแต่ละภาพและใช้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 ​​ที่จำเป็นฉันได้รวมวิธีแก้ปัญหา (ไม่ดี) ไว้สำหรับสิ่งนั้น
terdon

แต่คุณช่วยอธิบายได้"$path"/"${name/%.*/.time.$ext}"ไหม โดยเฉพาะ/%.*/ส่วนที่ นอกจากนี้หากฉันต้องการใส่ส่วน "เวลา" ไว้ข้างหน้าเช่น time.a.jpg แทนที่จะเป็น a.time.jpg ฉันจะทำอย่างไร
แอนดรู

@Andrew ที่ทดแทนสตริงเพียงแค่ดูที่นี่ มันจะแทนที่ทุกอย่างหลังจาก.ตัวอักษรตัวสุดท้ายด้วย.time.$ext( $extเป็นส่วนขยายที่จับไว้ก่อนหน้านี้) ที่จะทำให้มันกลายเป็นการเปลี่ยนแปลงที่time.a.jpg ${name/#/time.}
terdon

- pointsize 48 หรือ -pointsize 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.