Каков наилучший способ геотегирования jpeg-изображений с помощью Python?[закрыто]

StackOverflow https://stackoverflow.com/questions/453395

  •  19-08-2019
  •  | 
  •  

Вопрос

У меня есть координаты из какого-то источника, и я хочу пометить ими свои файлы jpg.Какая библиотека Python лучше всего подходит для записи геотегов в данные exif?

Это было полезно?

Решение

пексиф было написано с геотегами в качестве цели (выделено мной):

pexif — это библиотека Python для анализа и, что более важно, редактирования данных EXIF ​​в файлах JPEG.

Это выросло из необходимость добавить данные с тегами GPS к моим изображениям, К сожалению, другие библиотеки не могли обновляться, и их архитектура не позволяла добавлять такие вещи.Разве многоразовое программное обеспечение не является грандиозным!

Моей главной целью написать это было желание предоставить простой способ присвоения геотегов моим фотографиям, и теперь библиотека кажется достаточно зрелой для этого.

Другие советы

Вот пример того, как установить позицию GPS с помощью библиотеки pyexiv2. Я протестировал этот скрипт, загрузив изображение с геотегом в Panoramio

#!/usr/bin/env python

import pyexiv2
import fractions
from PIL import Image
from PIL.ExifTags import TAGS
import sys

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
        min = int(t1)
        sec = round((t1 - min)* 60, 5)
        return (deg, min, sec, loc_value)    

def set_gps_location(file_name, lat, lng):
    """Adds GPS position as EXIF metadata

    Keyword arguments:
    file_name -- image file 
    lat -- latitude (as float)
    lng -- longitude (as float)

    """
    lat_deg = to_deg(lat, ["S", "N"])
    lng_deg = to_deg(lng, ["W", "E"])

    print lat_deg
    print lng_deg

    # convert decimal coordinates into degrees, munutes and seconds
    exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1))
    exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1))

    exiv_image = pyexiv2.Image(file_name)
    exiv_image.readMetadata()
    exif_keys = exiv_image.exifKeys() 

    exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat
    exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3]
    exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng
    exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3]
    exiv_image["Exif.Image.GPSTag"] = 654
    exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84"
    exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0'

    exiv_image.writeMetadata()

set_gps_location(sys.argv[1], float(sys.argv[2]), float(sys.argv[3]))

Я сам не пробовал, но из документации [pyexiv2] [1] похоже, что она должна делать эту работу.

[1]: http://tilloy.net/dev/pyexiv2/tutorial.html #link отсутствует последний символ

приведенный выше код работает, но мне пришлось изменить функцию set_gps_location для работы с текущей версией pyexiv2 ... возможно, Максим использовал более старую версию:

def set_gps_location(file_name, lat, lng):
    """Adds GPS position as EXIF metadata

    Keyword arguments:
    file_name -- image file
    lat -- latitude (as float)
    lng -- longitude (as float)

    """
    lat_deg = to_deg(lat, ["S", "N"])
    lng_deg = to_deg(lng, ["W", "E"])

    print lat_deg
    print lng_deg

    # convert decimal coordinates into degrees, munutes and seconds
    exiv_lat = (pyexiv2.Rational(lat_deg[0]*60+lat_deg[1],60),pyexiv2.Rational(lat_deg[2]*100,6000), pyexiv2.Rational(0, 1))
    exiv_lng = (pyexiv2.Rational(lng_deg[0]*60+lng_deg[1],60),pyexiv2.Rational(lng_deg[2]*100,6000), pyexiv2.Rational(0, 1))
    metadata = pyexiv2.ImageMetadata(file_name)
    metadata.read()

##    exif_keys = metadata.exif_keys

    metadata["Exif.GPSInfo.GPSLatitude"] = exiv_lat
    metadata["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3]
    metadata["Exif.GPSInfo.GPSLongitude"] = exiv_lng
    metadata["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3]
    metadata["Exif.Image.GPSTag"] = 654
    metadata["Exif.GPSInfo.GPSMapDatum"] = "WGS-84"
    metadata["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0'

    metadata.write()

pyexiv2 теперь устарела в пользу GExiv2 , основанного на GObject обертка вокруг libexiv2.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top