fix: 修复 GTiff 输出缺失 .hdr 导致的波长元数据断链

copy_hdr_info 原实现要求目标 .hdr 已存在,但 GTiff/BIGTIFF 输出时 GDAL 不会自动生成 .hdr,导致波长信息丢失、下游采样无法解析波段。

改为:源 .hdr 候选路径兼容 x.hdr / x.bip.hdr / x.HDR 等多种命名;目标无 .hdr 时直接以源 .hdr 为基底旁置创建,已存在时仍走 write_fields_to_hdrfile 合并逻辑。
This commit is contained in:
duxin
2026-09-15 10:34:36 +08:00
parent f97527598d
commit abc8fe5694

View File

@ -276,34 +276,62 @@ def save_bands_as_image(corrected_bands: list, output_path: str,
def copy_hdr_info(source_img_path: str, dest_img_path: str) -> bool:
"""
复制原始影像的hdr文件信息如波长等到目标影像的hdr文件
将源影像的 .hdr 元数据(尤其是波长)继承到目标影像。
★ 断链修复:若目标影像无 .hdr如 GTiff/BIGTIFF 输出GDAL 不自动生成),
主动以源 .hdr 为基底创建旁置 .hdr保证下游采样等能读取波长
若目标 .hdr 已存在ENVI 场景),走原有合并逻辑 write_fields_to_hdrfile。
Args:
source_img_path: 源影像文件路径原始bsq文件
dest_img_path: 目标影像文件路径去耀斑后的bsq文件
source_img_path: 源影像文件路径(原始 bsq/bip 等
dest_img_path: 目标影像文件路径(去耀斑后的 bsq
Returns:
bool: 是否成功
"""
import shutil
if not UTIL_AVAILABLE:
print("警告: util模块未导入无法复制hdr文件信息")
return False
# 1) 定位源 .hdr兼容 x.hdr / x.bip.hdr / x.HDR 等命名习惯)
src_hdr = None
src_candidates = []
_existing = get_hdr_file_path(source_img_path)
if _existing:
src_candidates.append(_existing)
_p = Path(source_img_path)
for _suff in ('.hdr', '.HDR'):
src_candidates.append(str(_p.with_suffix(_suff)))
src_candidates.append(str(Path(str(_p) + _suff)))
for _cand in src_candidates:
if _cand and Path(_cand).exists():
src_hdr = Path(_cand)
break
if src_hdr is None:
print(f"警告: 源影像无 .hdr 文件,无法提取波长元数据: {source_img_path}")
return False
# 2) 目标 .hdr 路径:以目标数据文件同名基底 + .hdr
dest_hdr_path = Path(os.path.splitext(dest_img_path)[0] + '.hdr')
# 3) ★ 核心修复:目标 .hdr 不存在(如 GTiff 场景)→ 直接旁置创建
if not dest_hdr_path.exists():
print(f"提示: 目标未自动生成 .hdr (如 GTiff 格式),正在主动创建旁置波长元数据: "
f"{dest_hdr_path}")
try:
source_hdr_path = get_hdr_file_path(source_img_path)
dest_hdr_path = get_hdr_file_path(dest_img_path)
if not Path(source_hdr_path).exists():
print(f"警告: 源hdr文件不存在: {source_hdr_path}")
shutil.copy2(str(src_hdr), str(dest_hdr_path))
return True
except Exception as e:
print(f"错误: 旁置 .hdr 文件生成失败: {e}")
return False
if not Path(dest_hdr_path).exists():
print(f"警告: 目标hdr文件不存在: {dest_hdr_path}")
return False
write_fields_to_hdrfile(source_hdr_path, dest_hdr_path)
# 4) 目标 .hdr 已存在ENVI 场景)→ 原有合并逻辑(把源波长等字段追加进去)
try:
write_fields_to_hdrfile(str(src_hdr), str(dest_hdr_path))
print(f"已复制原始hdr文件信息到: {dest_hdr_path}")
return True
except Exception as e:
print(f"警告: 复制hdr文件信息时出错: {e}")
print(f"错误: 追加 .hdr 元数据失败: {e}")
return False