使用PyExifTool无法向JP2文件写入GeoTIFF元数据求助
解决方案:将GeoTIFF元数据复制到JP2文件
问题背景
尝试把TIFF的GeoTIFF元数据通过pyexiftool写入JP2文件时,所有GeoTiff标签都提示不存在或不可写,无法完成元数据复制。
核心原因
JP2采用GeoJP2标准存储地理元数据,和TIFF的GeoTIFF标签体系不兼容,直接写入GeoTiff:命名空间的标签不被JP2支持。
可行方案
方案1:用GDAL直接转换(推荐)
GDAL在格式转换时会自动保留完整地理元数据,无需手动处理标签映射:
from osgeo import gdal # 关闭GDAL的PAM文件生成,避免额外元数据文件 gdal.SetConfigOption('GDAL_PAM_ENABLED', 'NO') # 读取源TIFF文件 src_dataset = gdal.Open(tiff_path, gdal.GA_ReadOnly) if not src_dataset: print(f"无法打开TIFF文件: {tiff_path}") exit() # 获取JP2驱动 jp2_driver = gdal.GetDriverByName('JP2OpenJPEG') if not jp2_driver: print("GDAL未安装JP2OpenJPEG驱动") exit() # 转换并保留所有元数据 dst_dataset = jp2_driver.CreateCopy(jp2_path, src_dataset, strict=0) if not dst_dataset: print(f"无法生成JP2文件: {jp2_path}") exit() # 释放资源 src_dataset = None dst_dataset = None
方案2:调整ExifTool标签命名空间
JP2支持通过XMP或ExifIFD命名空间存储地理元数据,可手动将关键GeoTIFF标签映射为JP2兼容标签:
import exiftool # 从TIFF读取的核心元数据(示例) tiff_metadata = { 'GeoTiff:ModelTiepointTag': [0, 0, 0, 395680.65, 4199400, 0], 'GeoTiff:ModelPixelScaleTag': [0.05, 0.05, 0], 'GeoTiff:ProjectedCSType': 2100 } # 映射为JP2支持的XMP标签 jp2_compatible_tags = { 'XMP:PixelScale': ','.join(map(str, tiff_metadata['GeoTiff:ModelPixelScaleTag'])), 'XMP:GCPs': ' '.join(map(str, tiff_metadata['GeoTiff:ModelTiepointTag'])), 'XMP:ProjectedCRS': tiff_metadata['GeoTiff:ProjectedCSType'] } with exiftool.ExifToolHelper() as et: et.set_tags(files=[jp2_path], tags=jp2_compatible_tags)
注意:此方法仅能写入部分关键元数据,完整地理信息仍推荐用GDAL处理。
方案3:用ExifTool命令行直接复制
通过ExifTool的-tagsFromFile参数自动处理标签映射,直接从TIFF复制兼容元数据到JP2:
exiftool -tagsFromFile input.tiff -all:all output.jp2
该命令会自动过滤JP2不支持的标签,但部分GeoTIFF专有元数据可能无法复制,需验证结果。
额外错误说明
代码末尾出现的RuntimeError: can't create new thread at interpreter shutdown是ExifToolHelper在程序退出时的资源释放问题,只要确保所有操作都在with上下文内完成,就能避免该错误。
内容的提问来源于stack exchange,提问作者mkr
相关产品推荐
相关产品推荐

