Thư viện thao tác Exif cho python [đã đóng]


108

Tôi đang tìm kiếm thư viện thao tác exif (Định dạng tệp hình ảnh có thể trao đổi) tốt cho python. Tôi thích sự linh hoạt (ví dụ: khả năng truy xuất các thẻ độc quyền của nhà cung cấp) hơn là tốc độ xử lý. Bạn đề nghị điều gì?


Có lẽ câu hỏi nên đọc: "Những tùy chọn nào có sẵn để chỉnh sửa Exif (Định dạng tệp hình ảnh có thể trao đổi) bằng python nhấn mạnh bộ tính năng (ví dụ: khả năng truy xuất thẻ độc quyền của nhà cung cấp và khả năng tương thích với nhiều định dạng hình ảnh) theo tốc độ?"
dlm

1
@Wooble và cộng sự: "Nếu câu hỏi này có thể được đổi từ cho phù hợp với các quy tắc trong trung tâm trợ giúp, vui lòng chỉnh sửa câu hỏi hoặc để lại nhận xét." Tôi đã làm điều sau, nhưng Q đóng cửa mà không có bình luận gì thêm. Đưa cái gì? (Chỉ cố gắng hiểu và không muốn lãng phí thời gian bình luận / chỉnh sửa câu hỏi nếu đó là một kết luận bị bỏ qua)
dlm

Tôi muốn ý kiến ​​của các nhà phát triển khác khi hỏi câu hỏi này! PackageOpinionOverflow?
Derek Litz

1
Hãy nhớ rằng hầu hết tất cả các giải pháp không phải exiv2 ở đây sẽ không thể truy cập MakerNote. Trong thẻ EXIF ​​này, các nhà sản xuất máy ảnh thêm các thẻ của riêng họ để chứa thông tin có giá trị. Vì vậy, bạn sẽ chỉ nhận được các thẻ cơ bản với hầu hết các thư viện từ các câu trả lời bên dưới.
user136036

Câu trả lời:


65

Bạn có thể muốn xem exif-py :

Thư viện Python để trích xuất dữ liệu EXIF ​​từ các tệp tiff và jpeg. Rất dễ sử dụng - $ ./EXIF.py image.jpg

hoặc Thư viện hình ảnh Python (PIL) :

Thư viện hình ảnh Python (PIL) bổ sung khả năng xử lý hình ảnh cho trình thông dịch Python của bạn. Thư viện này hỗ trợ nhiều định dạng tệp và cung cấp khả năng xử lý hình ảnh và đồ họa mạnh mẽ.

Ngoài ra còn có pyexif được đặt tên phù hợp: http://pyexif.sourceforge.net/

Thư viện pyexif python và các công cụ nhằm mục đích trích xuất thông tin EXIF ​​từ các tệp Jpeg và Tiff bao gồm nó. Thông tin này thường được bao gồm trong các hình ảnh được tạo bằng thiết bị hình ảnh kỹ thuật số như máy ảnh kỹ thuật số, máy quét phim kỹ thuật số, v.v.

Tuy nhiên, có vẻ như pyexif đã không được cập nhật trong một thời gian dài. Họ khuyến nghị nếu họ không thực hiện thủ thuật để kiểm tra EXIF-py, vì vậy bạn có thể nên thử cái đó trước, vì trang sourceforge của họ gần đây dường như có một số hoạt động ở đó, mặc dù không nhiều. Cuối cùng, sử dụng PIL, bạn có thể làm điều này:

from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(fn):
    ret = {}
    i = Image.open(fn)
    info = i._getexif()
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    return ret

Tuyên bố từ chối trách nhiệm :
Tôi thực sự không biết cách nào là tốt nhất, đây chỉ là những gì tôi có thể kết hợp với Google. :)


19
Không có "giải pháp" nào trong số này có thể ghi lại thẻ EXIF, vì vậy chúng không phải là giải pháp cho câu hỏi.
odinho - Velmont

22
Mặc dù về mặt kỹ thuật không cho phép viết thẻ EXIF, nhưng tôi thấy điều này rất hữu ích. +1 để viết mã.
Cerin

3
Không có PIL cho Python 3.x
Hơn 5

Tổng quan đẹp. Chỉ cần lưu ý: có vẻ như exif-py hiện không tương thích với Python 3.x (đã thử nghiệm với Python 3.3.3, xem thêm github.com/ianare/exif-py/issues/12 ).
cel

3
@MoreThanFive Có một PIL fork được duy trì nhiều và tích hợp với pip! github.com/python-pillow/Pillow
ibizaman

59

Bản thân tôi gần đây đã sử dụng pyexiv2 và nó có vẻ khá phù hợp với nhu cầu của tôi. Có lẽ nó cũng phù hợp với bạn.


9
Đối với bản ghi: pyexiv2 dường như được duy trì tốt nhất trong số đó và là bản hoàn chỉnh nhất (bao gồm cả việc ghi thẻ EXIF ​​trở lại tệp).
rbp

1
Có thể dễ dàng cài đặt pyexiv2 bên trong virtualenv không?
Matt Austin

2
Quá trình bảo trì dường như bị chậm lại và việc cài đặt trên máy Mac là một địa ngục. : /
Vortexfive

6
Đối với những người quan tâm: Thật không may, pyexiv2 chỉ có sẵn cho Python 2.
texnic

1
<QUOTE src = " redmine.yorba.org/projects/gexiv2/wiki "> Điều này sẽ hoạt động tốt như nhau với Python 2 hoặc 3, điều này làm cho GExiv2 trở thành một sự thay thế tuyệt vời cho pyexiv2, chỉ hỗ trợ Python 2. </QUOTE>
jno

31

Các giải pháp dựa trên Exiv2

Exiv2 (exiv2: http://exiv2.org/ ) là một thư viện C ++ mã nguồn mở trưởng thành hỗ trợ đọc và ghi siêu dữ liệu cho nhiều loại hình ảnh (JPEG, PNG, TIFF và nhiều định dạng thô), hiểu tiêu chuẩn (Xmp, IPTC và Exif) và siêu dữ liệu không chuẩn ("Makernotes"), và chạy trên nhiều nền tảng (Windows, Linux và, với một số công việc là Mac).

Các liên kết Python với exiv2 là:

Một lợi thế của pyexiv2 là có một bản dựng cửa sổ có sẵn cho python 2.7. Yêu cầu xây dựng cửa sổ cho gexiv2 ở đây: https://bugzilla.gnome.org/show_bug.cgi?id=712441

exiv2 và các ràng buộc đều là mã nguồn mở (GPL).


cập nhật này dựa trên thông tin mới nhất về các ràng buộc để exiv2
DLM

pyexiv2đã được phân nhánh: py3exiv2.tuxfamily.org .
Artem Klevtsov

liên kết đếnoy.net đã chết
jtlz2

5

Bài viết này mô tả một mô-đun Python để viết siêu dữ liệu EXIF ​​(và không chỉ đọc chúng) bằng Python thuần túy. Rõ ràng, không có PIL, pyexif, cũng như EXIF-py hỗ trợ viết EXIF. pyexiv2 dường như có tính cạnh tranh và dành riêng cho nền tảng.


Không chắc liệu đây có thể được coi là cạnh ít chảy máu hơn không.
Mad Physicist

5

Sử dụng PIL :)

import os,sys
from PIL import Image
from PIL.ExifTags import TAGS

if __name__ == '__main__':
    for (k,v) in Image.open(sys.argv[1])._getexif().iteritems():
        print '%s = %s' % (TAGS.get(k), v)
    os.system('pause')

1
Pure PIL / Pillow không cho phép sửa đổi thẻ EXIF. Nhưng có một thư viện nhỏ giúp với điều đó: github.com/hMatoba/Pyxif
Simon Steinberger

4

Trang tại http://redmine.yorba.org/projects/gexiv2/wiki (đã trở thành https://wiki.gnome.org/Projects/gexiv2 ) đọc ngay bây giờ :

Điều này sẽ hoạt động tốt như nhau với Python 2 hoặc 3, điều này làm cho GExiv2 trở thành một sự thay thế tuyệt vời cho pyexiv2, vốn chỉ hỗ trợ Python 2.

Vì vậy, cả Python2 và Python3 hiện đều được GExiv2 hỗ trợ.

Tin tốt.


2
Các liên kết không hoạt động. công trình này wiki.gnome.org/Projects/gexiv2
user881300

cập nhật tốt! Đã 3 năm trôi qua kể từ năm 2013 ...
jno

3

Bạn cũng có thể xem thư viện jpeg.py của Gheorghe Milas tại http://www.emilas.com/jpeg/ , là "Thư viện python để phân tích cú pháp, đọc và ghi siêu dữ liệu JPEG EXIF, IPTC và COM".

Một hạn chế là dường như anh ta đang lưu trữ miền của mình trên một IP động thông qua DynDNS, vì vậy nó không phải lúc nào cũng có sẵn.


Không tồn tại nữa.
Simon Steinberger

3

bằng cách nào đó tôi nhận được một thuộc tínhError cho _getexif với mã của Paolo ở trên .. Tôi đang sử dụng Python 2.6.6 và PIL 1.1.7. _Getexif bây giờ có lỗi thời không ??

Đây là một sửa đổi nhỏ phù hợp với tôi.

from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(fn):
    ret = {}
    i = Image.open(fn)
#    info = i._getexif()
    info = i.tag.tags
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    return ret


3

Tôi đã sử dụng các trình bao bọc của riêng mình xung quanh http://www.sno.phy.queensu.ca/~phil/exiftool/ - lý do là nó rất hoàn chỉnh, nhà phát triển rất tích cực. Và việc không thể hỗ trợ hầu hết tất cả các định dạng hình ảnh là một yếu tố tuyệt vời cho dự án mà nó cần

Hạn chế của tất nhiên là nó không phải là python, vì vậy bạn sẽ cần phải sử dụng các cuộc gọi quy trình con, như tôi làm.


Có một trình bao bọc trăn cho exiftool github.com/smarnach/pyexiftool . Một phiếu bầu cho exiftool vì thực tế là nó rất hoàn chỉnh.
Long Vu

Anh ấy đang yêu cầu một lib Python.
Diego Woitasen


0

Trong Python 2.6, vị trí của mô-đun là khác nhau. Dùng cái này:

import Image    
from ExifTags import TAGS
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.