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)
Ich habe die folgenden Dokumente gefunden.
Demnach scheint GPS Info IFD wie folgt definiert zu sein.
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.
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.
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.
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