Frage

Ich müssen, um die Größe von jpg-Bildern mit Python ohne zu verlieren die original Bild die EXIF-Daten (Metadaten über das Aufnahmedatum, das Kameramodell etc.).Alle google-suchen über python und Bilder zeigen die PIL-Bibliothek, die ich verwende, aber nicht zu sein scheinen in der Lage zu behalten, Metadaten.Der code, den ich bisher (mit PIL) ist dieser:

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')

Irgendwelche Ideen?Oder anderen Bibliotheken, die ich verwenden könnte?

War es hilfreich?

Lösung

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

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

Andere Tipps

Sie können pyexiv2 zum kopieren von EXIF Daten aus Quelle Bild.Im folgenden Beispiel Bild die neue Größe mit PIL-Bibliothek, die EXIF-Daten kopiert mit pyexiv2 und Bild Größe EXIF-Felder gesetzt, die mit der neuen Größe.

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))

Es gibt tatsächlich eine wirklich einfache Weg zu kopieren die EXIF-Daten von einem Bild zu einem anderen mit nur PIL.Obwohl es nicht erlaubt zu ändern die exif-tags.

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)

Wie Sie sehen können, ist die speichern-Funktion kann die exif-argument, das erlaubt, kopieren Sie die raw-exif-Daten in das neue Bild beim speichern.Sie nicht wirklich brauchen keine anderen lib, wenn das ist alles, was Sie tun möchten.Ich kann nicht scheinen zu finden, jede Dokumentation, auf den speichern-Optionen und ich weiß gar nicht, ob das spezifisch für Kissen oder arbeiten mit PIL zu.(Wenn jemand irgendeine Art von link, ich würde mich freuen, wenn Sie postete es in die Kommentare)

Warum nicht mit ImageMagick ?
Es ist durchaus ein Standard-Werkzeug (zum Beispiel, ist es das Standardwerkzeug von Gallery 2 verwendet wird); Ich habe es nie benutzt, aber es hat einen Python-Schnittstelle als auch (oder können Sie auch einfach den Befehl laichen) und vor allem sollte die EXIF-Informationen zwischen alle Transformation erhalten.

Für pyexiv2 v0.3.2, die API-Dokumentation bezieht sich auf die copy-Methode zum tragen über die EXIF-Daten von einem Bild zum anderen.In diesem Fall wäre es die EXIF-Daten des ursprünglichen Bildes über das verkleinerte Bild.

Going off @Maksym Kozlenko, der aktualisierte code für das kopieren die EXIF-Daten:

    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()

Sie können mit pyexiv2 die Datei ändern, nachdem es zu speichern.

Hier ist eine aktualisierte Antwort als 2018. piexif ist eine reine Python-Bibliothek für mich, die leicht über pip installiert (pip installieren piexif) und funktionierte wunderbar (danke, Maintainer!). https://pypi.org/project/piexif/

Die Benutzung ist sehr einfach, eine einzige Zeile wird die akzeptierte Antwort replizieren und alle EXIF-Tags aus dem Originalbild auf das skalierte Bild kopieren:

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

Ich habe noch nicht versucht, aber es sieht aus wie Sie auch Änderungen leicht unter Verwendung der Last, dump ausführen können, und Funktionen ein, wie in der verknüpften Dokumentation beschrieben.

PIL Griffe EXIF-Daten, nicht wahr? Schauen Sie in 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)

Geprüft Kissen 2.5.3

Es scheint @ Depado-Lösung nicht für mich arbeiten, in meinem Szenario wird das Bild nicht einmal ein exif Segment enthalten.

pyexiv2 ist hart an meinem Mac zu installieren, stattdessen verwende ich das Modul pexif https : //github.com/bennoleslie/pexif/blob/master/pexif.py . Um zu einem Bild „Exif-Segment hinzufügen“ enthält keine Exif-Daten, habe ich die Exif-Daten in einem Bild enthalten, die ein exif Segment besitzt

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top