Libreria di manipolazione Exif per python [chiusa]


108

Sto cercando una buona libreria di manipolazione exif (Exchangeable image file format) per Python. Preferisco la flessibilità (ad esempio, la capacità di recuperare i tag proprietari dei fornitori) rispetto alla velocità di elaborazione. Che cosa suggeriresti?


Forse la domanda dovrebbe essere: "Quali opzioni sono disponibili per modificare Exif (Exchangeable image file format) utilizzando python che enfatizzano il set di funzionalità (ad esempio la capacità di recuperare i tag proprietari dei fornitori e la compatibilità con un'ampia varietà di formati di immagine) rispetto alla velocità?"
dlm

1
@ Wooble et al: "Se questa domanda può essere riformulata per adattarla alle regole nel Centro assistenza, modifica la domanda o lascia un commento." Ho fatto quest'ultimo, ma il Q si è chiuso senza ulteriori commenti. Cosa succede? (
Sto

Volevo l'opinione di altri sviluppatori quando ho posto questa domanda! PackageOpinionOverflow?
Derek Litz

1
Tieni presente che praticamente tutte le soluzioni non exiv2 qui non saranno in grado di accedere MakerNote. In questo tag EXIF, i produttori di fotocamere aggiungono i propri tag che contengono informazioni preziose. Quindi otterrai solo i tag di base con la maggior parte delle librerie dalle risposte seguenti.
user136036

Risposte:


65

Potresti voler controllare exif-py :

Libreria Python per estrarre dati EXIF ​​da file tiff e jpeg. Molto facile da usare - $ ./EXIF.py image.jpg

o la Python Imaging Library (PIL) :

La Python Imaging Library (PIL) aggiunge funzionalità di elaborazione delle immagini al tuo interprete Python. Questa libreria supporta molti formati di file e fornisce potenti capacità grafiche e di elaborazione delle immagini.

C'è anche il nome appropriato pyexif: http://pyexif.sourceforge.net/

La libreria e gli strumenti python pyexif hanno lo scopo di estrarre informazioni EXIF ​​dai file Jpeg e Tiff che lo includono. Queste informazioni sono generalmente incluse nelle immagini create utilizzando dispositivi di imaging digitale come fotocamere digitali, scanner per pellicole digitali, ecc.

Tuttavia, sembra che pyexif non sia stato aggiornato da molto tempo. Raccomandano se il loro non sta facendo il trucco per controllare EXIF-py, quindi dovresti probabilmente provare prima quello, poiché la loro pagina sourceforge sembra avere qualche attività lì ultimamente, anche se non molto. Infine, usando PIL puoi fare questo:

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

Disclaimer : in
realtà non ho idea di quale sia il migliore, questo è proprio quello che sono riuscito a mettere insieme con Google. :)


20
Nessuna di queste "soluzioni" può riscrivere i tag EXIF, quindi non sono una soluzione alla domanda.
odinho - Velmont

23
Sebbene tecnicamente non consenta la scrittura di tag EXIF, l'ho trovato molto utile. +1 per la scrittura del codice.
Cerin

3
Nessun PIL per Python 3.x
Più di cinque

Bella panoramica. Solo una nota: exif-py non è attualmente compatibile con Python 3.x a quanto pare (testato con Python 3.3.3, vedi anche github.com/ianare/exif-py/issues/12 ).
cel

3
@MoreThanFive C'è un fork PIL che viene mantenuto pesantemente e che si integra con pip! github.com/python-pillow/Pillow
ibizaman

59

Ho usato personalmente pyexiv2 di recente e sembra adattarsi abbastanza bene alle mie esigenze. Forse potrebbe adattarsi anche al tuo.


9
Per la cronaca: pyexiv2 sembra essere il meglio mantenuto di tutti e il più completo (inclusa la riscrittura dei tag EXIF ​​nel file).
rbp

1
Pyexiv2 può essere facilmente installato all'interno di un virtualenv?
Matt Austin

2
La manutenzione sembra essere rallentata e l'installazione su Mac è un inferno. : /
Vortexfive

6
Per coloro a cui importa: Sfortunatamente, pyexiv2 è disponibile solo per Python 2.
texnic

1
<QUOTE src = " redmine.yorba.org/projects/gexiv2/wiki "> Funzionerà ugualmente bene con Python 2 o 3, il che rende GExiv2 un eccellente sostituto di pyexiv2, che supporta solo Python 2. </QUOTE>
jno

31

Soluzioni basate su Exiv2

Exiv2 (exiv2: http://exiv2.org/ ) è una libreria C ++ matura e open source che supporta la lettura e la scrittura di metadati in molti tipi di immagini (JPEG, PNG, TIFF e molti formati raw), comprende gli standard (Xmp, IPTC ed Exif) e metadati non standard ("Makernotes") e funziona su più piattaforme (Windows, Linux e, con un po 'di lavoro, Mac).

I collegamenti di Python a exiv2 sono:

Un vantaggio di pyexiv2 è che è disponibile una build di Windows per python 2.7. Una richiesta di build di Windows per gexiv2 è qui: https://bugzilla.gnome.org/show_bug.cgi?id=712441

exiv2 e le associazioni sono tutti open source (GPL).


aggiornato in base alle ultime informazioni sui collegamenti a exiv2
dlm

pyexiv2è stato biforcato: py3exiv2.tuxfamily.org .
Artem Klevtsov

Link tilloy.net morto
jtlz2

5

Questo articolo descrive un modulo Python per scrivere metadati EXIF ​​(e non solo per leggerli) usando Python puro. Apparentemente, nessuno dei PIL, pyexif o EXIF-py supporta la scrittura di EXIF. pyexiv2 sembra essere all'avanguardia e specifico della piattaforma.


Non sono sicuro che questo possa essere considerato meno sanguinante.
Fisico pazzo

5

Usa 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 non consente la modifica dei tag EXIF. Ma c'è una piccola biblioteca che aiuta in questo: github.com/hMatoba/Pyxif
Simon Steinberger

4

La pagina su http://redmine.yorba.org/projects/gexiv2/wiki (è diventata https://wiki.gnome.org/Projects/gexiv2 ) ora si legge :

Funzionerà ugualmente bene con Python 2 o 3, il che rende GExiv2 un eccellente sostituto di pyexiv2, che supporta solo Python 2.

Quindi, sia Python2 che Python3 sono ora supportati da GExiv2.

Buone notizie.


2
il collegamento non funziona. funziona wiki.gnome.org/Projects/gexiv2
user881300

buon aggiornamento! Sono passati 3 anni dal 2013 ...
jno

3

Potresti anche guardare la libreria jpeg.py di Gheorghe Milas su http://www.emilas.com/jpeg/ , che è "Una libreria python per analizzare, leggere e scrivere i metadati JPEG EXIF, IPTC e COM".

Uno svantaggio è che sembra ospitare il suo dominio su un IP dinamico tramite DynDNS, quindi non è sempre disponibile.


Non esiste più.
Simon Steinberger

3

in qualche modo ottengo un attributoError per _getexif con il codice di Paolo sopra .. Sto usando Python 2.6.6 e PIL 1.1.7. _Getexif è obsoleto adesso ??

Ecco una piccola modifica che ha funzionato per me.

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

Ho iniziato a scrivere la mia piccola libreria basata sul codice in PIL. controllalo qui .


1
Ehi, sembra buono. Eventuali spigoli vivi con esso?
Rich

@Rich: non ricordo più. Ha funzionato per me.
Albert

3

Ho usato i miei wrapper su http://www.sno.phy.queensu.ca/~phil/exiftool/ - il motivo è che è molto completo, lo sviluppatore è molto attivo. E non essere in grado di supportare quasi tutti i formati di immagine è uno spettacolo assoluto per il progetto per cui è necessario

Lo svantaggio ovviamente è che non è Python, quindi dovresti usare chiamate di sottoprocesso, come faccio io.


C'è un wrapper Python per exiftool github.com/smarnach/pyexiftool . Un voto per exiftool per il fatto che è molto completo.
Long Vu

Chiede una libreria Python.
Diego Woitasen


0

In Python 2.6 il posto del modulo è diverso. Usa questo:

import Image    
from ExifTags import TAGS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.