如何使用Python将.cr3格式图片批量转换为.exr格式?
用Python批量转换CR3到EXR的实现方案
可用的开源工具组合
处理CR3(佳能RAW格式)到EXR的转换,核心依赖两个Python开源库:
- rawpy:专门读取各类RAW图像格式(含CR3),可解码RAW数据为浮点型像素数组。
- imageio:封装了EXR格式的写入逻辑,操作更简洁;也可使用官方的
OpenEXR库。
前置准备
先安装所需依赖包,部分系统需先配置底层依赖:
- Linux系统:先安装libraw开发库
sudo apt-get install libraw-dev - 全平台:通过pip安装Python库
pip install rawpy numpy imageio
单文件转换示例
以下代码读取单个CR3文件,经过RAW后处理(参数可按需调整),再保存为EXR:
import rawpy import imageio def cr3_to_exr(input_path, output_path): # 读取CR3文件,启用无损解压缩 with rawpy.imread(input_path) as raw: # 后处理RAW数据,保留原始动态范围 output = raw.postprocess( use_camera_wb=True, # 使用相机内置白平衡 no_auto_bright=True, # 禁用自动提亮 output_bps=16 # 输出16位浮点数据,适配EXR格式 ) # 写入EXR文件 imageio.imwrite(output_path, output, format='EXR') # 调用示例 cr3_to_exr("sample.cr3", "sample.exr")
批量处理脚本
针对大量CR3文件,可遍历指定目录自动转换:
import os import rawpy import imageio def batch_cr3_to_exr(input_dir, output_dir): # 创建输出目录(不存在则自动生成) os.makedirs(output_dir, exist_ok=True) # 遍历目录下所有.cr3文件 for filename in os.listdir(input_dir): if filename.lower().endswith('.cr3'): input_path = os.path.join(input_dir, filename) output_filename = os.path.splitext(filename)[0] + '.exr' output_path = os.path.join(output_dir, output_filename) # 执行转换 with rawpy.imread(input_path) as raw: output = raw.postprocess( use_camera_wb=True, no_auto_bright=True, output_bps=16 ) imageio.imwrite(output_path, output, format='EXR') print(f"完成转换:{filename} -> {output_filename}") # 调用示例 batch_cr3_to_exr("./cr3_files", "./exr_output")
关键参数说明
use_camera_wb=True:使用相机内置白平衡参数,避免偏色;如需自定义,可改为user_wb=(r, g, b)。no_auto_bright=True:保留RAW文件的原始动态范围,匹配EXR的高动态特性。output_bps=16:输出16位浮点数据,是EXR的常用格式;也可选择32位浮点(output_bps=32),文件体积会相应增大。
注意事项
- 较新的CR3格式需确保rawpy为最新版本:
pip install --upgrade rawpy。 - 转换过程占用内存较高,可根据机器配置分批次处理大数量文件。
内容的提问来源于stack exchange,提问作者Tech Biz
相关产品推荐
相关产品推荐

