가장 좋은 방법은,하지만 심각하게 my program, GottenGeography ;-)
그러나와 확실히, 그 코드는 다음과 같습니다
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)]
현재 GIF 인트로 스펙 션을 사용하여 exiv2 라이브러리에 훨씬 더 직접적으로 액세스하는 pyexiv2 대신 GExiv2이라는 대체물을 사용하고 있지만 이에 대한 의견이 있기를 바랍니다. gexiv2와 pyexiv2는 모두 같은 exiv2 라이브러리를 감싸는 래퍼입니다. 그러나 차이점은 pyexiv2는 많은 양의 접착제가 포함 된 매우 큰 프로젝트이며 파이썬에서만 작동하며 포기할 위기에 처해 있다는 것입니다. gexiv2는 가볍고 민첩하며 모든 프로그래밍 언어에서 액세스 할 수 있으며 Shotwell의 사용 덕분에 잘 유지됩니다.
희망이 도움이됩니다.
* pyexiv2's author, Olivier Tilloy, has asked me for help with maintainership as he no longer has much time