Thêm dấu thời gian vào hình ảnh từ dòng lệnh Linux


9

Tôi có một thư mục đầy hình ảnh. Tôi đang cố gắng thêm dấu thời gian vào chính hình ảnh, cho mỗi hình ảnh, dựa trên ngày tệp được tạo. Điều này có thể không? Tôi đã đọc bài viết này ở đây , nhưng nó sử dụng dữ liệu exif. Hình ảnh của tôi không có dữ liệu exif.

Tôi có thể trực tiếp thêm dấu thời gian bằng cách sử dụng ngày đã tạo không? Hay tôi phải sử dụng dữ liệu exif? Nếu tôi phải sử dụng dữ liệu exif, tôi sẽ viết nó bằng cách sử dụng ngày được tạo như thế nào?

Tôi đang sử dụng Ubuntu Server không có GUI, vì vậy tôi sẽ cần một giải pháp dòng lệnh. Có ai giúp được không? Cảm ơn!

Câu trả lời:


18

Nếu bạn muốn ghi ngày tạo của tệp hình ảnh vào chính hình ảnh (nếu đó không phải là điều bạn muốn, vui lòng chỉnh sửa câu hỏi của bạn), bạn có thể sử dụng imagemagick.

  1. Cài đặt ImageMagick nếu chưa được cài đặt:

    sudo apt-get install imagemagick
    
  2. Chạy một vòng lặp bash sẽ lấy ngày tạo của mỗi ảnh và sử dụng converttừ imagemagickbộ để chỉnh sửa ảnh:

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

    Đối với mỗi hình ảnh được đặt tên foo.jpg, điều này sẽ tạo ra một bản sao được gọi time_foo.jpgvới dấu thời gian ở phía dưới bên phải. Bạn có thể làm điều này một cách thanh lịch hơn, đối với nhiều loại tệp và tên đầu ra đẹp nhưng cú pháp phức tạp hơn một chút:

OK, đó là phiên bản đơn giản. Tôi đã viết một tập lệnh có thể xử lý các tình huống phức tạp hơn, các tệp trong thư mục con, tên tệp lạ, v.v. Theo tôi biết, chỉ có hình ảnh .png và .tif có thể chứa dữ liệu EXIF ​​nên không có điểm nào để chạy trên các định dạng khác . Tuy nhiên, như một cách giải quyết có thể, bạn có thể sử dụng ngày tạo tệp thay vì dữ liệu EIF. Điều này rất có thể không giống với ngày hình ảnh được chụp mặc dù vậy kịch bản dưới đây có phần liên quan được nhận xét. Xóa các bình luận nếu bạn muốn nó xử lý theo cách này.

Lưu tập lệnh này dưới dạng add_watermark.shvà chạy nó trong thư mục chứa các tệp của bạn:

bash /path/to/add_watermark.sh

Nó sử dụng exiv2mà bạn có thể cần phải cài đặt ( sudo apt-get install exiv2). Kịch bản:

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

Đây chính xác là những gì tôi đang tìm kiếm! Tuy nhiên, tôi nhận được kết quả đầu ra sau: 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.Ngoài ra, tôi vẫn chưa quyết định liệu tôi có muốn sử dụng các thư mục con chưa; bạn có thể chỉ cho bạn cách sử dụng findkhông? Cảm ơn!
Andrew

@Andrew có hai vấn đề có thể xảy ra, một là tôi đã không trích dẫn đúng các biến và do đó khoảng trắng trong tên tệp sẽ gây ra sự cố. Hãy thử kịch bản trong câu trả lời cập nhật. Nếu nó vẫn thất bại, hình ảnh của bạn có thể không chứa dữ liệu EXIF ​​cần thiết, tôi đã bao gồm một cách giải quyết (xấu) cho điều đó.
terdon

Đã được một lúc, nhưng bạn có thể giải thích những gì "$path"/"${name/%.*/.time.$ext}"không? Đặc biệt, /%.*/một phần. Ngoài ra, nếu tôi muốn đặt phần "thời gian" ở phía trước, ví dụ: time.a.jpg thay vì a.time.jpg, làm thế nào tôi có thể làm điều đó?
Andrew

@Andrew đó chỉ là chuỗi thay thế, xem tại đây . Nó sẽ thay thế mọi thứ sau .ký tự cuối cùng bằng .time.$ext( $extlà phần mở rộng được chụp trước đó). Để làm cho nó vào time.a.jpg, thay đổi đó để ${name/#/time.}.
terdon

-pointize 48 hoặc -pointize 72 chắc chắn dễ đọc hơn. :-)
Corey S.

0

Vui lòng kiểm tra http://jambula.sourceforge.net/ để chèn ngày / thời gian / nhận xét chụp ảnh trên một hình ảnh jpeg ở các định dạng và ngôn ngữ khác nhau. Một tính năng đặc biệt là tem ngày là lossless. Nó cũng được hỗ trợ trên Linux và Mac.


0

Chỉ cần vẽ các tệp vào thư mục trống và chuyển AWK sang shell. Có thể một chút oldskool nhưng ít ưa thích hơn, ít ký tự hơn để gõ, ví dụ:

ls | awk '{print "convert "$0" -gravity SouthEast -pointsize 22 -fill white -annotate +30+30 %[exif:DateTimeOriginal] dated"$0}' | sh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.