簡體   English   中英

使用 Python 3.6 覆蓋 Image Exif 中的 GPS 坐標

[英]Overwrite GPS coordinates in Image Exif using Python 3.6

我正在嘗試轉換圖像地理標記,以便圖像和地面控制點位於我的軟件(Pix4D 映射器)內的同一坐標系中。

這里的答案說:

Exif 數據是標准化的,GPS 數據必須使用上述地理坐標(分鍾、秒等)而不是分數進行編碼。 除非它在 ​​exif 標簽中以該格式編碼,否則它不會粘住。

這是我的代碼:

import os, piexif, pyproj
from PIL import Image

img = Image.open(os.path.join(dirPath,fn))
exif_dict = piexif.load(img.info['exif'])

breite = exif_dict['GPS'][piexif.GPSIFD.GPSLatitude]
lange = exif_dict['GPS'][piexif.GPSIFD.GPSLongitude]

breite = breite[0][0] / breite[0][1] + breite[1][0] / (breite[1][1] * 60) + breite[2][0] / (breite[2][1] * 3600)
lange = lange[0][0] / lange[0][1] + lange[1][0] / (lange[1][1] * 60) + lange[2][0] / (lange[2][1] * 3600)
print(breite) #48.81368778730952
print(lange) #9.954511162420633
x, y = pyproj.transform(wgs84, gk3, lange, breite) #from WGS84 to GaussKrüger zone 3 
print(x) #3570178.732528623
print(y) #5408908.20172699
exif_dict['GPS'][piexif.GPSIFD.GPSLatitude] = [ ( (int)(round(y,6) * 1000000), 1000000 ), (0, 1), (0, 1) ]

exif_bytes = piexif.dump(exif_dict) #error here
img.save(os.path.join(outPath,fn), "jpeg", exif=exif_bytes)

我在轉儲方法中收到 struct.error: argument out of range 。 原始 GPSInfo 標簽看起來像: {0: b'\\x02\\x03\\x00\\x00', 1: 'N', 2: ((48, 1), (48, 1), (3449322402, 70000000)), 3: 'E', 4: ((9, 1), (57, 1), (1136812930, 70000000)), 5: b'\\x00', 6: (3659, 10)}

我猜我必須在寫入之前偏移值並正確編碼它們,但不知道要做什么。

看起來您已經在使用 PIL 和 Python 3.x,不確定是否要繼續使用piexif但無論哪種方式,您可能會發現piexif度、分和秒轉換為十進制更容易。 看起來您已經在嘗試這樣做,但將其放在單獨的函數中可能會更清晰並考慮方向參考。

下面是一個例子:

def get_decimal_from_dms(dms, ref):

    degrees = dms[0][0] / dms[0][1]
    minutes = dms[1][0] / dms[1][1] / 60.0
    seconds = dms[2][0] / dms[2][1] / 3600.0

    if ref in ['S', 'W']:
        degrees = -degrees
        minutes = -minutes
        seconds = -seconds

    return round(degrees + minutes + seconds, 5)

def get_coordinates(geotags):
    lat = get_decimal_from_dms(geotags['GPSLatitude'], geotags['GPSLatitudeRef'])

    lon = get_decimal_from_dms(geotags['GPSLongitude'], geotags['GPSLongitudeRef'])

    return (lat,lon)

本例中的geotags是一個字典,以 GPSTAGS 作為關鍵字,而不是數字代碼,以提高可讀性。 您可以在此博客文章中找到更多詳細信息和完整示例: Python 3 中的地理編碼 Exif 圖像元數據入門

經過大量的折邊和折騰后,我到達了py3exiv2圖像元數據操作庫的頁面。 人們會在閱讀時找到詳盡的元數據標簽列表,但這里是EXIF 標簽列表,只是為了節省幾次點擊。

在 Linux 上運行流暢,並提供了許多編輯圖像標題的機會。 文檔也很清楚。 我建議將此作為解決方案,並且很想知道它是否也能解決其他所有人的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM