gpt4 book ai didi

python - 使用 pyexiv2 对 JPEG 进行地理标记

转载 作者:太空狗 更新时间:2023-10-30 01:23:39 31 4
gpt4 key购买 nike

我正在使用 pyexiv2 Python 模块使用我在另一个 SO 答案中找到的代码对 JPEG 进行地理标记(请参阅:What is the best way to geotag jpeg-images using Python?),我对 GPSTag 值有疑问。

答案中给出的代码有以下几行:

exiv_image["Exif.Image.GPSTag"] = 654
exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84"
exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 0 0 0'

我看过 Exiv2 documentation并找到了 GPSTag、GPSMapDatum 和 GPSVersionID 的描述,但仍然对 GPSTag 的值感到困惑。

从文档中说:

A pointer to the GPS Info IFD. The Interoperability structure of the GPS Info IFD, like that of Exif IFD, has no image data.

这个描述并没有真正解释如何确定要使用的值,我也无法在网上找到更好的 GPSTag 描述。

所以我的问题是:

  1. 给定一张新图像,如何确定 Exif.Image.GPSTag 的值?
  2. 为什么代码示例使用值 654(这可以通过问题一来回答)?

感谢您的帮助。

最佳答案

使用 pyexiv2 对照片进行地理标记的最佳方式肯定是使用 my program, GottenGeography ;-)

但说真的,如果您想从 pyexiv2 访问 GPS 数据,该代码如下所示:

    GPS = 'Exif.GPSInfo.GPS'
try:
self.latitude = dms_to_decimal(
*self.exif[GPS + 'Latitude'].value +
[self.exif[GPS + 'LatitudeRef'].value]
)
self.longitude = dms_to_decimal(
*self.exif[GPS + 'Longitude'].value +
[self.exif[GPS + 'LongitudeRef'].value]
)
except KeyError:
pass
try:
self.altitude = float(self.exif[GPS + 'Altitude'].value)
if int(self.exif[GPS + 'AltitudeRef'].value) > 0:
self.altitude *= -1
except KeyError:
pass

写起来是这样的:

    self.exif[GPS + 'AltitudeRef']  = '0' if self.altitude >= 0 else '1'
self.exif[GPS + 'Altitude'] = Fraction(self.altitude)
self.exif[GPS + 'Latitude'] = decimal_to_dms(self.latitude)
self.exif[GPS + 'LatitudeRef'] = 'N' if self.latitude >= 0 else 'S'
self.exif[GPS + 'Longitude'] = decimal_to_dms(self.longitude)
self.exif[GPS + 'LongitudeRef'] = 'E' if self.longitude >= 0 else 'W'
self.exif[GPS + 'MapDatum'] = 'WGS-84'

有了这些支持函数:

class Fraction(fractions.Fraction):
"""Only create Fractions from floats.

>>> Fraction(0.3)
Fraction(3, 10)
>>> Fraction(1.1)
Fraction(11, 10)
"""

def __new__(cls, value, ignore=None):
"""Should be compatible with Python 2.6, though untested."""
return fractions.Fraction.from_float(value).limit_denominator(99999)

def dms_to_decimal(degrees, minutes, seconds, sign=' '):
"""Convert degrees, minutes, seconds into decimal degrees.

>>> dms_to_decimal(10, 10, 10)
10.169444444444444
>>> dms_to_decimal(8, 9, 10, 'S')
-8.152777777777779
"""
return (-1 if sign[0] in 'SWsw' else 1) * (
float(degrees) +
float(minutes) / 60 +
float(seconds) / 3600
)


def decimal_to_dms(decimal):
"""Convert decimal degrees into degrees, minutes, seconds.

>>> decimal_to_dms(50.445891)
[Fraction(50, 1), Fraction(26, 1), Fraction(113019, 2500)]
>>> decimal_to_dms(-125.976893)
[Fraction(125, 1), Fraction(58, 1), Fraction(92037, 2500)]
"""
remainder, degrees = math.modf(abs(decimal))
remainder, minutes = math.modf(remainder * 60)
return [Fraction(n) for n in (degrees, minutes, remainder * 60)]

虽然我目前正在研究 pyexiv2 的替代方案,它使用 GObject 内省(introspection)来更直接地访问 exiv2 库,称为 GExiv2 , 并希望对此有一些反馈。 gexiv2 和 pyexiv2 都是同一个 exiv2 库的包装器,但不同之处在于 pyexiv2 是一个非常大的项目,有很多胶水,只能在 python 中工作,并且处于放弃的边缘*;而 gexiv2 轻巧灵活,可以从任何编程语言访问,并且由于 Shotwell 使用它而得到很好的维护。

希望这对您有所帮助!

* pyexiv2's author, Olivier Tilloy, has asked me for help with maintainership as he no longer has much time

关于python - 使用 pyexiv2 对 JPEG 进行地理标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10799366/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com