Biblioteca de manipulação Exif para python [fechada]

108

Estou procurando uma boa biblioteca de manipulação de exif (formato de arquivo de imagem trocável) para python. Eu prefiro flexibilidade (por exemplo, capacidade de recuperar tags proprietárias dos provedores) do que velocidade de processamento. O que você sugeriria?

oo_olo_oo
fonte
Talvez a pergunta devesse ser: "Quais opções estão disponíveis para editar Exif (formato de arquivo de imagem trocável) usando python que enfatiza o conjunto de recursos (por exemplo, capacidade de recuperar tags proprietárias dos provedores e compatibilidade com uma ampla variedade de formatos de imagem) em relação à velocidade?"
dlm
1
@Wooble et al: "Se esta pergunta puder ser reformulada para se ajustar às regras da Central de Ajuda, edite a pergunta ou deixe um comentário." Fiz o último, mas o Q fechou sem mais comentários. O que da? (Só estou tentando entender, e não quero perder tempo comentando / editando perguntas se for uma conclusão precipitada)
dlm
Eu queria a opinião de outros desenvolvedores ao fazer esta pergunta! PackageOpinionOverflow?
Derek Litz de
1
Tenha em mente que praticamente todas as soluções não exiv2 aqui não serão capazes de acessar MakerNote. Nesta tag EXIF, os fabricantes de câmeras adicionam suas próprias tags que contêm informações valiosas. Portanto, você obteria apenas as tags básicas com a maioria das bibliotecas das respostas abaixo.
user136036

Respostas:

65

Você pode querer verificar exif-py :

Biblioteca Python para extrair dados EXIF ​​de arquivos tiff e jpeg. Muito fácil de usar - $ ./EXIF.py image.jpg

ou a Python Imaging Library (PIL) :

A Python Imaging Library (PIL) adiciona recursos de processamento de imagem ao seu interpretador Python. Esta biblioteca oferece suporte a vários formatos de arquivo e fornece processamento de imagem poderoso e recursos gráficos.

Também existe o pyexif apropriadamente chamado: http://pyexif.sourceforge.net/

A biblioteca e ferramentas pyexif python visa extrair informações EXIF ​​de arquivos Jpeg e Tiff que as incluem. Essas informações são normalmente incluídas em imagens criadas usando dispositivos de imagem digital, como câmeras digitais, scanners de filme digital, etc.

No entanto, parece que o pyexif não é atualizado há algum tempo. Eles recomendam, se o deles não funcionar, verifique o EXIF-py, então você provavelmente deve tentar esse primeiro, pois a página do sourceforge parece ter alguns atividade ultimamente, embora não muito. Finalmente, usando PIL, você pode fazer isso:

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

Isenção de responsabilidade :
na verdade, não tenho ideia do que é melhor, isso é apenas o que eu consegui juntar com o Google. :)

Paolo Bergantino
fonte
20
Nenhuma dessas "soluções" pode escrever tags EXIF ​​de volta, portanto, não são uma solução para a questão.
odinho - Velmont
23
Embora tecnicamente não permita a gravação de tags EXIF, achei isso muito útil. 1 para escrever código.
Cerin de
3
Sem PIL para Python 3.x
Mais de cinco
Boa visão geral. Apenas uma observação: atualmente, exif-py não é compatível com Python 3.x ao que parece (testado com Python 3.3.3, consulte também github.com/ianare/exif-py/issues/12 ).
cel
3
@MoreThanFive Existe um fork PIL que é fortemente mantido e que se integra com pip! github.com/python-pillow/Pillow
ibizaman
59

Eu tenho usado o pyexiv2 recentemente e parece se adequar perfeitamente às minhas necessidades. Talvez seja adequado ao seu também.


fonte
9
Para o registro: pyexiv2 parece ser o mais bem mantido de todos eles, e o mais completo (incluindo a gravação de tags EXIF ​​de volta no arquivo).
rbp
1
O pyexiv2 pode ser facilmente instalado dentro de um virtualenv?
Matt Austin
2
A manutenção parece desacelerar e a instalação no Mac é um inferno. : /
Vortexfive
6
Para quem se importa: Infelizmente, pyexiv2 está disponível apenas para Python 2.
texnic
1
<QUOTE src = " redmine.yorba.org/projects/gexiv2/wiki "> Isso funcionará igualmente bem com Python 2 ou 3, o que torna GExiv2 um excelente substituto para pyexiv2, que suporta apenas Python 2. </QUOTE>
jno
31

Soluções baseadas em Exiv2

Exiv2 (exiv2: http://exiv2.org/ ) é uma biblioteca C ++ madura de código aberto que oferece suporte à leitura e gravação de metadados em muitos tipos de imagem (JPEG, PNG, TIFF e muitos formatos brutos) e entende padrão (Xmp, IPTC e Exif) e metadados não padrão ("Makernotes"), e é executado em várias plataformas (Windows, Linux e, com algum trabalho, Mac).

As ligações Python para exiv2 são:

Uma vantagem do pyexiv2 é que existe uma versão do Windows disponível para o python 2.7. Uma solicitação do Windows Build para gexiv2 está aqui: https://bugzilla.gnome.org/show_bug.cgi?id=712441

exiv2 e as ligações são todos de código aberto (GPL).

dlm
fonte
atualizou isto com base nas informações mais recentes sobre ligações para exiv2
dlm
pyexiv2foi bifurcado: py3exiv2.tuxfamily.org .
Artem Klevtsov
link tilloy.net
inativo
5

Este artigo descreve um módulo Python para escrever metadados EXIF ​​(e não apenas lê-los) usando Python puro. Aparentemente, nenhum de PIL, pyexif, nem EXIF-py suporta a escrita EXIF. pyexiv2 parece ser de ponta e específico da plataforma.

Jason R. Coombs
fonte
Não tenho certeza se isso pode ser considerado algo menos inovador.
Mad Physicist
5

Use 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')
Max
fonte
1
Pure PIL / Pillow não permite a modificação de tags EXIF. Mas há uma pequena biblioteca ajudando com isso: github.com/hMatoba/Pyxif
Simon Steinberger
4

A página em http://redmine.yorba.org/projects/gexiv2/wiki (tornou-se https://wiki.gnome.org/Projects/gexiv2 ) agora diz :

Isso funcionará igualmente bem com Python 2 ou 3, o que torna GExiv2 um excelente substituto para pyexiv2, que só oferece suporte a Python 2.

Portanto, Python2 e Python3 agora são suportados por GExiv2.

Boas notícias.

jno
fonte
2
O link não funciona. isso funciona wiki.gnome.org/Projects/gexiv2
user881300
boa atualização! 3 anos se passaram desde 2013 ...
jno
3

Você também pode consultar a biblioteca jpeg.py de Gheorghe Milas em http://www.emilas.com/jpeg/ , que é "Uma biblioteca python para analisar, ler e gravar metadados JPEG EXIF, IPTC e COM."

Uma desvantagem é que ele parece estar hospedando seu domínio em um IP dinâmico via DynDNS, portanto, nem sempre está disponível.


fonte
Não existe mais.
Simon Steinberger
3

de alguma forma eu obtenho um attributeError para _getexif com o código de Paolo acima .. Estou usando Python 2.6.6 e PIL 1.1.7. _Getexif está obsoleto agora ??

Aqui está uma pequena modificação que funcionou para mim.

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
Otterb
fonte
3

Comecei a escrever minha própria pequena biblioteca baseada no código em PIL. verifique aqui .

Albert
fonte
1
Ei, isso parece bom. Alguma ponta afiada com isso?
Rich
@Rich: Não me lembro mais. Ele tem trabalhado para mim.
Albert,
3

Tenho usado meus próprios invólucros em http://www.sno.phy.queensu.ca/~phil/exiftool/ - a razão é que ele é muito completo, o dev é muito ativo. E não ser capaz de suportar quase todos os formatos de imagem é um obstáculo absoluto para o projeto que é necessário para

A desvantagem, claro, é que não é python, então você precisaria usar chamadas de subprocesso, como eu.

Geert Dekkers
fonte
Existe um wrapper python para exiftool github.com/smarnach/pyexiftool . Um voto para exiftool pelo fato de ser muito completo.
Long Vu
Ele está pedindo uma biblioteca Python.
Diego Woitasen
1

Existem alguns exemplos de uso de PIL e EXIF.py em ASPN

Michał Niklas
fonte
0

No Python 2.6, o local do módulo é diferente. Usa isto:

import Image    
from ExifTags import TAGS
Tomasz Nazar
fonte