[Python] Lecture et écriture de balises d'informations de localisation de photos (GPS Exif du fichier JPG)

introduction

Ceci est également mon propre mémo. Vous pouvez le faire facilement avec python. En guise de mise en garde

Il existe plusieurs bibliothèques associées. Il vaut mieux l'unifier à l'un d'eux, mais c'est un mémo qui a fonctionné pour le moment. (Hey)

Spécification?

J'ai trouvé les documents suivants.

Selon cela, GPS Info IFD semble être défini comme suit.

image.png

Il y en a beaucoup, mais les fichiers que j'ai traités n'étaient que des balises 0-6. J'étais capable de lire et d'écrire la latitude, la longitude et la hauteur du GPS, donc c'était suffisant pour le moment. Ici, le GPS LatitudeRef utilise une seule lettre «N» ou «S» pour indiquer la latitude nord et la latitude sud. La latitude GPS est exprimée en minutes.

Lire et écrire avec python

Lire la latitude et la longitude avec l'oreiller

J'ai utilisé [Pillow](9 https://pypi.org/project/Pillow/). Je ne me souviens pas si j'ai eu du mal à me préparer.

pip3 install pillow

Je pourrais lire la latitude et la longitude ci-dessous.

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)

avec ça

{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}

Vous obtiendrez des résultats comme Vous pouvez voir la signification en la comparant à la définition de GPS INfo IFD dans la spécification précédente. Puisqu'il s'agit de degrés, minutes et secondes, une conversion est nécessaire pour le convertir en notation décimale. Par exemple


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

Pour obtenir `` 35.34819823888889 ''.

Réécrire la latitude et la longitude du GPS Exif avec piexif

J'ai utilisé piexif. C'est une stratégie pour lire et réécrire Gps exif avec conversion en degrés, minutes, secondes et minutes en fonction.

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)     

Pour faire ce qui suit:

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)

Je pense que cela était basé sur StackOverflow, mais j'ai perdu le lien. Si vous le trouvez, ajoutez-le.

Résumé / Sentiments divers

Ceci est un mémo lorsque je lis et écris GPSExif sur la photo au besoin.

C'était un article disant que c'était un mémo de travail d'Eiya, alors j'aimerais l'élargir. Cela a été compliqué ces derniers temps. .. ^^; (08/08/2020)

Recommended Posts

[Python] Lecture et écriture de balises d'informations de localisation de photos (GPS Exif du fichier JPG)
Lecture et écriture de fichiers CSV Python
Lire et écrire NetCDF avec Python
Lire et écrire du CSV avec Python
Lire et écrire du texte en Python
Lire et écrire des fichiers JSON avec Python
Voir les informations sur les fichiers et les dossiers sur python
Étude à partir de Python Lecture et écriture de fichiers Hour9
Lire et écrire des fichiers CSV et JSON avec Python
La lecture et l'écriture s'adaptent aux fichiers avec Python (mémo)
Exemple de lecture et d'écriture de CSV avec Python
[Note] Lecture de fichier ~ Python ~
Lecture du fichier pyc (Python 3.5.2)
lecture de fichier externe python
Notes sur la lecture et l'écriture d'images TIFF float32 avec python
Lire et écrire des fichiers csv
uproot: bibliothèque basée sur Python / Numpy pour lire et écrire des fichiers ROOT