[Python] Lesen und Schreiben von Tags für Fotostandortinformationen (GPS Exif der JPG-Datei)

Einführung

Dies ist auch mein eigenes Memo. Sie können es leicht mit Python tun. Als Einschränkung

Es gibt mehrere verwandte Bibliotheken. Es ist besser, es mit einem von ihnen zu vereinheitlichen, aber es ist ein Memo, das vorerst funktioniert hat. (Hallo)

Spezifikation?

Ich habe die folgenden Dokumente gefunden.

Demnach scheint GPS Info IFD wie folgt definiert zu sein.

image.png

Es gibt viele, aber die Dateien, mit denen ich mich befasst habe, waren nur die Tags 0-6. Ich konnte den Breitengrad, den Längengrad und die Höhe von GPS lesen und schreiben, also war es vorerst genug. Hier verwendet GPS LatitudeRef einen einzelnen Buchstaben 'N'or'S', um den nördlichen Breitengrad und den südlichen Breitengrad anzuzeigen. Die GPS-Breite wird in Minuten angegeben.

Lesen und schreiben Sie mit Python

Lesen Sie Breiten- und Längengrade mit Pillow

Ich habe [Pillow] verwendet (9 https://pypi.org/project/Pillow/). Ich erinnere mich nicht, ob es mir schwer gefallen ist, mich vorzubereiten.

pip3 install pillow

Ich konnte den Längen- und Breitengrad unten lesen.

read_gpsexif.py


from PIL import Image
infile = "test.JPG"
img = Image.open( infile )
exif = img._getexif()
for k, v in exif.items():
    if k==34853:
        print(v)

mit diesem

{0: b'\x02\x00\x00\x00',
 1: 'N',
 2: (35.0, 20.0, 53.51123),
 3: 'E',
 4: (137.0, 9.0, 17.83123),
 5: b'\x00', 6: 256.123}

Sie erhalten Ergebnisse wie Sie können die Bedeutung erkennen, indem Sie sie mit der Definition von GPS INfo IFD in der vorherigen Spezifikation vergleichen. Da es sich um Grad, Minuten und Sekunden handelt, ist eine Konvertierung erforderlich, um sie in Dezimalschreibweise umzuwandeln. Zum Beispiel


deg,minu,sec = 35.0, 20.0, 53.51366
deg + minu/60.0 + sec/3600.0

Um `` `35.34819823888889``` zu erhalten.

Schreiben Sie GPS Exif Längen- und Breitengrad mit piexif neu

Ich habe [piexif] verwendet (https://pypi.org/project/piexif/). Es ist eine Strategie, GPS-Exif mit Konvertierung in Grad, Minuten, Sekunden und Minuten als Funktion zu lesen und neu zu schreiben.

def _to_deg(value, loc):                                                                                                                                               
    if value < 0:                                                                                                                                                    
       loc_value = loc[0]                                                                                                                                       
    elif value > 0:                                                                                                                                                  
       loc_value = loc[1]
    else:                                                                                                                                                            
       loc_value = ""                                                                                                                                           
    abs_value = abs(value)
    deg =  int(abs_value)                                                                                                                                        
    t1 = (abs_value-deg)*60                                                                                                                                      
    minu = int(t1)                                                                                                                                                
    sec = round((t1 - minu)* 60, 5)
    return (deg, min, sec, loc_value)                                                                                                                                                                                                                                                                                     

import Fraction
def _change_to_rational(number):
    f = Fraction(str(number))                                                                                                                                    
    return (f.numerator, f.denominator)     

Gehen Sie wie folgt vor:

write_gpsexif.py


import piexif
lat, lng, altitude = 39.123, 139.123, 50.123
jpg_filepath = "test.JPG"

lat_deg = to_deg(lat, ["S", "N"])
lng_deg = to_deg(lng, ["W", "E"])
                                                                                                                            exif_lat = (change_to_rational(lat_deg[0]), change_to_rational(lat_deg[1]), change_to_rational(lat_deg[2]))
exif_lng = (change_to_rational(lng_deg[0]), change_to_rational(lng_deg[1]), change_to_rational(lng_deg[2]))
gps_ifd = {
    piexif.GPSIFD.GPSVersionID: (2, 0, 0, 0),
    piexif.GPSIFD.GPSAltitudeRef: 0,
    piexif.GPSIFD.GPSAltitude: change_to_rational(round(altitude, 3)),
    piexif.GPSIFD.GPSLatitudeRef: lat_deg[3],
    piexif.GPSIFD.GPSLatitude: exif_lat,
    piexif.GPSIFD.GPSLongitudeRef: lng_deg[3],
    piexif.GPSIFD.GPSLongitude: exif_lng,
}

gps_exif = {"GPS": gps_ifd}
exif_data = piexif.load(jpg_filepath)
exif_data.update(gps_exif)
exif_bytes = piexif.dump(exif_data)
piexif.insert(exif_bytes, file_name)

Ich denke, dies basierte auf StackOverflow, aber ich habe den Link verloren. Wenn Sie es finden, fügen Sie es hinzu.

Zusammenfassung / Verschiedene Gefühle

Dies ist ein Memo, wenn ich GPSExif nach Bedarf auf dem Foto lese und schreibe.

Es war ein Beitrag, der besagte, dass es sich um ein Arbeitsmemo von Eiya handelt, daher möchte ich es erweitern. Es war in letzter Zeit chaotisch. .. ^^; (2020/08/08)

Recommended Posts

[Python] Lesen und Schreiben von Tags für Fotostandortinformationen (GPS Exif der JPG-Datei)
Lesen und Schreiben von Python CSV-Dateien
Lesen und Schreiben von NetCDF mit Python
Lesen und Schreiben von CSV mit Python
Lesen und Schreiben von Text in Python
Lesen und Schreiben von JSON-Dateien mit Python
Siehe Datei- und Ordnerinformationen zu Python
Studie aus Python Lesen und Schreiben von Hour9-Dateien
Lesen und Schreiben von CSV- und JSON-Dateien mit Python
Lesen und Schreiben passt Dateien mit Python (Memo)
Beispiel für das Lesen und Schreiben von CSV mit Python
[Hinweis] Datei lesen ~ Python ~
Pyc-Datei lesen (Python 3.5.2)
Lesen einer externen Python-Datei
Hinweise zum Lesen und Schreiben von float32 TIFF-Bildern mit Python
Lesen und Schreiben von CSV-Dateien
entwurzeln: Python / Numpy-basierte Bibliothek zum Lesen und Schreiben von ROOT-Dateien