Pergunta

Eu preciso para redimensionar imagens jpg com Python sem perder os dados da imagem original EXIF ??(metadados sobre data tomada, modelo de câmera etc.). Todas as pesquisas do Google sobre python e imagens apontam para a biblioteca PIL que eu estou usando atualmente, mas não parece ser capaz de manter os metadados. O código que eu tenho até agora (usando PIL) é o seguinte:

img = Image.open('foo.jpg')
width,height = 800,600
if img.size[0] < img.size[1]:
    width,height = height,width

resized_img = img.resize((width, height), Image.ANTIALIAS) # best down-sizing filter
resized_img.save('foo-resized.jpg')

Todas as idéias? Ou outras bibliotecas que eu poderia estar usando?

Foi útil?

Solução

import jpeg
jpeg.setExif(jpeg.getExif('foo.jpg'), 'foo-resized.jpg') 

http://www.emilas.com/jpeg/

Outras dicas

Você pode usar pyexiv2 para copiar dados EXIF ??imagem de origem a partir. Na imagem exemplo a seguir é redimensionada usando a biblioteca PIL, dados EXIF ??copiado com campos pyexiv2 e EXIF ??tamanho da imagem são definidas com o novo tamanho.

def resize_image(source_path, dest_path, size):
    # resize image
    image = Image.open(source_path)
    image.thumbnail(size, Image.ANTIALIAS)
    image.save(dest_path, "JPEG")

    # copy EXIF data
    source_image = pyexiv2.Image(source_path)
    source_image.readMetadata()
    dest_image = pyexiv2.Image(dest_path)
    dest_image.readMetadata()
    source_image.copyMetadataTo(dest_image)

    # set EXIF image size info to resized size
    dest_image["Exif.Photo.PixelXDimension"] = image.size[0]
    dest_image["Exif.Photo.PixelYDimension"] = image.size[1]
    dest_image.writeMetadata()

# resizing local file
resize_image("41965749.jpg", "resized.jpg", (600,400))

Há realmente uma maneira realmente simples de copiar dados EXIF ??de uma imagem para outra com apenas PIL. Embora não permite modificar as etiquetas EXIF.

image = Image.open('test.jpg')
exif = image.info['exif']
# Your picture process here
image = image.rotate(90)
image.save('test_rotated.jpg', 'JPEG', exif=exif)

Como você pode ver, a função de economia pode tomar o argumento exif que permite copiar os dados EXIF ??matérias na nova imagem ao salvar. Você realmente não precisa de nenhum outro lib se isso é tudo que você quer fazer. Eu não consigo encontrar qualquer documentação sobre a opções de salvamento e eu nem sei se isso é específico para descanso ou trabalhar com PIL também. (Se alguém tem algum tipo de link, eu apreciaria se postaram nos comentários)

Por que não usar ImageMagick
Ele é uma ferramenta bastante padrão (por exemplo, é a ferramenta padrão utilizado por Galeria 2); Eu nunca usei-o, no entanto, tem um python interface de bem (ou, você pode também simplesmente gerar o comando) e, acima de tudo, deve manter as informações EXIF ??entre todos transformação.

Para v0.3.2 pyexiv2, o documentação da API refere-se ao método de cópia para transitar dados EXIF ??de uma imagem para outra. Neste caso, seria os dados EXIF ??da imagem original até a imagem redimensionada.

Saindo @Maksym Kozlenko, o código atualizado para copiar dados EXIF ??é:

    source_image = pyexiv2.ImageMetadata(source_path)
    source_image.read()

    dest_image = pyexiv2.ImageMetadata(dest_path)
    dest_image.read()

    source_image.copy(dest_image,exif=True)
    dest_image.write()

Você pode usar pyexiv2 para modificar o arquivo depois de salvá-lo.

Aqui está uma resposta atualizado a partir de 2018. piexif é uma biblioteca python puro que para mim instalado facilmente através pip (pip instalar piexif) e trabalhou muito bem (obrigado, mantenedores!). https://pypi.org/project/piexif/

O uso é muito simples, uma única linha vai replicar a resposta aceita e copiar todas as etiquetas EXIF ??da imagem original para a imagem redimensionada:

import piexif
piexif.transplant("foo.jpg", "foo-resized.jpg")

Eu ainda não tentei, mas parece que você também pode realizar modifcations facilmente usando a carga, descarga, e inserir funções, conforme descrito na documentação associada.

alças PIL Dados EXIF, não é? Procurar em PIL.ExifTags.

from PIL import Image
img_path = "/tmp/img.jpg"
img = Image.open(img_path)
exif = img.info['exif']
img.save("output_"+img_path, exif=exif)

Testado em Pillow 2.5.3

Parece @ solução de Depado não funciona para mim, no meu cenário a imagem não contém sequer um segmento exif.

pyexiv2 é difícil de instalar no meu Mac, em vez disso, use o módulo pexif https : //github.com/bennoleslie/pexif/blob/master/pexif.py . "Adicionar exif segmento" a uma imagem não contém informações EXIF ??da imagem, eu adicionei a informação exif contido em uma imagem que possui um segmento exif

from pexif import JpegFile

#get exif segment from an image
jpeg = JpegFile.fromFile(path_with_exif)
jpeg_exif = jpeg.get_exif()

#import the exif segment above to the image file which does not contain exif segment
jpeg = JpegFile.fromFile(path_without_exif)
exif = jpeg.import_exif(jpeg_exif)
jpeg.writeFile(path_without_exif)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top