如何在Python中裁剪并保存DNG原始图像(保留元数据)
可行,具体实现方案如下
核心逻辑
通过rawpy读取DNG原始Bayer数据(无插值、无色彩转换),裁剪后配合元数据处理工具更新图像尺寸等关键信息,最后用imageio将裁剪后的原始数据和修正后的元数据一起保存为新DNG。
步骤与代码示例
- 先安装依赖库
pip install rawpy imageio piexif
- 实现代码
import rawpy import imageio import piexif # 加载原始DNG文件 with rawpy.imread("input.dng") as raw: # 获取无插值的原始Bayer像素数组(二维uint16格式) raw_pixels = raw.raw_image.copy() # 读取原DNG的Exif元数据 exif_metadata = piexif.load(raw.metadata["exif"]) # 执行裁剪(示例:裁剪坐标(y_start:y_end, x_start:x_end),自行替换为你的需求) crop_y_start, crop_y_end = 200, 1200 crop_x_start, crop_x_end = 300, 1300 cropped_pixels = raw_pixels[crop_y_start:crop_y_end, crop_x_start:crop_x_end] # 更新元数据中的图像尺寸 exif_metadata["Exif"][piexif.ExifIFD.PixelXDimension] = cropped_pixels.shape[1] exif_metadata["Exif"][piexif.ExifIFD.PixelYDimension] = cropped_pixels.shape[0] # (可选)更新DNG特有的裁剪相关元数据(比如ActiveArea,不同相机字段可能不同) # 若原DNG有ActiveArea字段,可按裁剪偏移量调整: # original_active = raw.active_area # new_active = (original_active[0]-crop_y_start, original_active[1]-crop_y_start, # original_active[2]-crop_x_start, original_active[3]-crop_x_start) # 需将new_active写入元数据对应字段,可通过raw.metadata查看原字段 # 保存裁剪后的DNG exif_bytes = piexif.dump(exif_metadata) imageio.imwrite("output_cropped.dng", cropped_pixels, format="DNG", exif=exif_bytes)
注意事项
- 原始raw数组是Bayer格式的二维数组,裁剪时尽量保证宽高为偶数(匹配Bayer阵列的2x2周期),避免后续软件处理时出现色彩错位
- 部分相机的DNG包含自定义元数据字段(如ActiveArea、DefaultCropSize),这些字段也需要同步更新,才能让Lightroom等专业软件正确识别裁剪后的图像
- 保存时需保证数据类型与原始raw一致(通常为
uint16),避免亮度信息丢失
内容的提问来源于stack exchange,提问作者benduvi20
相关产品推荐
相关产品推荐

