如何修改JPG-fi的XMP标签

2024-10-01 11:19:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个基于python的脚本,用于将地理参考信息应用于JPG图像。你知道吗

我已经知道了如何应用纬度、经度和高度,现在正在研究如何应用偏航、俯仰、横滚、水平精度和垂直精度。你知道吗

根据this link,方向和精度数据存储为XMP标记。你知道吗

我为修改XMP数据编写的代码如下所示:

# Reading/Modifying EXIF data
from pyexiv2 import Image

# Converting decimals to Rational
from fractions import Fraction

def convert_rational(value):
    return str(Fraction.from_float(value).limit_denominator(100))

def convert_double(value):
    return str(float(value))

def modify_xmp_data(photo, yaw, pitch, roll, XY_acc, Z_acc):
    xmp_mod_dict = {
        'Xmp.Camera.Yaw' : convert_double(yaw),
        'Xmp.Camera.Pitch' : convert_double(pitch),
        'Xmp.Camera.Roll' : convert_double(roll),

        'Xmp.Camera.GPSXYAccuracy' : convert_rational(XY_acc),
        'Xmp.Camera.GPSZAccuracy' : convert_rational(Z_acc)
    }

    i = Image(photo)
    i.modify_xmp(xmp_mod_dict)

def print_georeference_data(photo):
    i = Image(photo)
    xmp_dict = i.read_xmp()

    print(photo)
    # Print yaw, pitch, roll, XY accuracy, Z accuracy
    if 'Xmp.Camera.Yaw' in xmp_dict: print('Xmp.Camera.Yaw : '+ xmp_dict ['Xmp.Camera.Yaw'])
    if 'Xmp.Camera.Pitch' in xmp_dict: print('Xmp.Camera.Pitch : '+ xmp_dict ['Xmp.Camera.Pitch'])
    if 'Xmp.Camera.Roll' in xmp_dict: print('Xmp.Camera.Roll : '+ xmp_dict ['Xmp.Camera.Roll'])
    if 'Xmp.Camera.GPSXYAccuracy' in xmp_dict: print('Xmp.Camera.GPSXYAccuracy : '+ xmp_dict ['Xmp.Camera.GPSXYAccuracy'])
    if 'Xmp.Camera.GPSZAccuracy' in xmp_dict: print('Xmp.Camera.GPSZAccuracy : '+ xmp_dict ['Xmp.Camera.GPSZAccuracy'])


# Test photo
photo = "180606_080056_01_01.jpg"

# Modify XMP (yaw, pitch, roll, XY accuracy, Z accuracy)
modify_xmp_data(photo, 72.7942, 1.7943, 2.8909, 5, 10)

# Prints EXIF and XMP geo-reference data
print_georeference_data(photo)

每当试图修改XMP数据时,我都会收到此错误:

RuntimeError: (Caught Exiv2 exception) No namespace info available for XMP prefix `Camera'

调用print_geoference_data(photo)的预期结果如下所示:

Xmp.Camera.Yaw : 72.7942
Xmp.Camera.Pitch : 1.7943
Xmp.Camera.Roll : 2.8909
Xmp.Camera.GPSXYAccuracy : 5
Xmp.Camera.GPSZAccuracy : 10

Tags: convertdataifdictcameraprintrollphoto