使用Python转换1.3GB DNG为PNG时遇图像过大无法处理问题
解决DNG转PNG时的LibRawTooBigError问题
我需要用Python将DNG文件转换为PNG格式,尝试了以下代码:
# open dng and convert import rawpy import imageio import os os.chdir(r'C:\Path\to\dir') path = r'path\to\file' with rawpy.imread(path) as raw: rgb = raw.postprocess() rgb_img.save('image.png')
运行时出现错误:
line 13, in <module> rgb = raw.postprocess() File "rawpy\_rawpy.pyx", line 887, in rawpy._rawpy.RawPy.postprocess File "rawpy\_rawpy.pyx", line 790, in rawpy._rawpy.RawPy.dcraw_process File "rawpy\_rawpy.pyx", line 438, in rawpy._rawpy.RawPy.ensure_unpack File "rawpy\_rawpy.pyx", line 432, in rawpy._rawpy.RawPy.unpack File "rawpy\_rawpy.pyx", line 936, in rawpy._rawpy.RawPy.handle_error rawpy._rawpy.LibRawTooBigError: b'Image too big for processing'
请问是否有转换DNG文件的替代方案,或绕过该错误的方法?
以下是ExifTool导出的文件信息:
ExifTool版本号 : 11.88 文件名 : DSCF0001.DNG 目录 : . 文件大小 : 1313 MB 文件修改日期/时间 : 2022:08:24 12:06:31+01:00 文件访问日期/时间 : 2022:08:25 08:17:15+01:00 文件inode修改日期/时间 : 2022:08:24 15:19:04+01:00 文件权限 : rwxrwxrwx 文件类型 : DNG 文件类型扩展名 : dng MIME类型 : image/x-adobe-dng Exif字节序 : 小端(Intel, II) 品牌 : FUJIFILM 相机型号名称 : GFX 100 预览图起始位置 : 115208860 方向 : 水平(正常) 每条纹行数 : 3000 预览图长度 : 3011337 软件 : FUJIFILM Pixel Shift Combiner 1.2.0.2(真实色彩+高分辨率模式) 修改日期 : 2022:08:24 12:06:29 作者 : 子文件类型 : 全分辨率图像 图像宽度 : 23296 图像高度 : 17472 每样本位数 : 16 16 16 压缩 : JPEG 光度解释 : 线性Raw 每像素样本数 : 3 平面配置 : 交错 瓦片宽度 : 128 瓦片长度 : 96 瓦片偏移量 : (二进制数据 341026 字节,使用 -b 选项提取) 瓦片字节数 : (二进制数据 198743 字节,使用 -b 选项提取) 黑电平 : 256 255 256 白电平 : 65535 65535 65535 默认缩放 : 1 1 默认裁剪原点 : 16 12 默认裁剪尺寸 : 23264 17448 抗锯齿强度 : 1 最佳质量缩放 : 1 操作码列表3 : WarpRectilinear, FixVignetteRadial 评级 : 0 版权 : 曝光时间 : 1/125 光圈值 : 8.0 曝光程序 : 手动 ISO : 100 感光度类型 : 标准输出感光度 标准输出感光度 : 100 Exif版本 : 0230 原始日期/时间 : 2019:03:10 00:44:16 创建日期 : 2019:03:10 00:44:16 快门速度值 : 1/125 光圈值 : 8.0 亮度值 : 8.57 曝光补偿 : 0 最大光圈值 : 2.0 测光模式 : 多分区测光 光源 : 未知 闪光灯 : 未使用闪光灯 焦距 : 110.0 mm 版本 : 0130 内部序列号 : 质量 : NORMAL 白平衡 : 自动 饱和度 : 0(正常) 白平衡微调 : 红色 +0,蓝色 +0 降噪 : 0(正常) 富士闪光灯模式 : 手动 闪光曝光补偿 : 0 对焦模式 : 手动 自动对焦模式 : 无 对焦像素 : 2001 1501 AF-S优先级 : 释放优先 AF-C优先级 : 释放优先 对焦模式2 : AF-M 自动对焦区域模式 : 单点 自动对焦点大小 : n/a 自动对焦区域大小 : n/a AF-C设置 : Set 1(多用途) AF-C跟踪灵敏度 : 2 AF-C速度跟踪灵敏度 : 0 AF-C区域切换 : 自动 慢同步 : 关闭 照片模式 : 手动 曝光次数 : 1 阴影色调 : 0(正常) 高光色调 : 0(正常) 镜头调制优化器 : 开启 颗粒效果 : 关闭 色彩铬效果 : 关闭 裁剪模式 : n/a 色彩铬FX蓝 : 关闭 快门类型 : 电子快门 自动包围曝光 : 未知(6) 序列号 : 1 驱动模式 : 单张拍摄 驱动速度 : n/a 模糊警告 : 无 对焦警告 : 良好 曝光警告 : 良好 动态范围 : 标准 胶片模式 : F0/标准(Provia) 动态范围设置 : 手动 开发动态范围 : 100 最小焦距 : 110 最大焦距 : 110 最小焦距时最大光圈 : 2 最大焦距时最大光圈 : 2 图像稳定 : 传感器位移;关闭;0 图像生成 : 原始图像 图像计数 : 34 防闪烁 : 关闭(0x0002) 检测到人脸 : 0 人脸元素数量 : 0 色彩空间 : 未校准 焦平面X分辨率 : 5320 焦平面Y分辨率 : 5320 焦平面分辨率单位 : cm 文件来源 : 数码相机 场景类型 : 直接拍摄 自定义渲染 : 正常 曝光模式 : 自动 等效35mm焦距 : 87 mm 场景捕获类型 : 标准 锐度 : 未知(3) 拍摄距离范围 : 未知(48) 序列号 : 镜头信息 : 110mm f/2 镜头品牌 : FUJIFILM 镜头型号 : GF110mmF2 R LM WR 镜头序列号 : DNG版本 : 1.4.0.0 DNG向后兼容版本 : 1.1.0.0 唯一相机型号 : FUJIFILM GFX 100 色彩矩阵1 : 1.7191 -1.1 0.1278 -0.3574 1.1733 0.2076 -0.0002 0.0497 0.654 色彩矩阵2 : 1.6212 -0.8423 -0.1583 -0.4336 1.2583 0.1937 -0.0195 0.0726 0.6199 模拟平衡 : 1 1 1 拍摄时中性值 : 0.5644 1 0.5153 基线曝光 : -0.01 基线噪声 : 1 基线锐度 : 1.33 线性响应极限 : 1 相机序列号 : DNG镜头信息 : 110mm f/2 阴影缩放 : 1 DNG私有数据 : (二进制数据 114927728 字节,使用 -b 选项提取) 校准光源1 : 标准光源A 校准光源2 : D65 光圈 : 8.0 图像尺寸 : 23296x17472 百万像素 : 407.0 预览图像 : (二进制数据 3011337 字节,使用 -b 选项提取) 等效35mm缩放因子: 0.8 快门速度 : 1/125 弥散圆 : 0.038 mm 视角 : 23.4 deg 焦距 : 110.0 mm(等效35mm焦距:87.0 mm) 超焦距距离 : 39.81 m 曝光值 : 13.0
解决方案
1. 调整rawpy参数绕过内存限制
你的图像是407MP的超大尺寸,rawpy默认处理全尺寸会触发LibRaw的内存限制,可以通过以下两种方式调整:
方式A:缩小输出尺寸
在postprocess中指定output_size参数,将图像缩小到可处理的尺寸:
import rawpy import imageio import os os.chdir(r'C:\Path\to\dir') path = r'path\to\file' with rawpy.imread(path) as raw: # 缩小为原尺寸的1/2,可根据需求调整比例 rgb = raw.postprocess(output_size=(raw.width // 2, raw.height // 2)) imageio.imwrite('image.png', rgb)
方式B:使用DNG内置的裁剪区域
DNG文件包含默认裁剪信息,启用crop=True可以只处理有效区域,减少内存占用:
import rawpy import imageio import os os.chdir(r'C:\Path\to\dir') path = r'path\to\file' with rawpy.imread(path) as raw: rgb = raw.postprocess(crop=True) imageio.imwrite('image.png', rgb)
2. 使用pyvips处理超大图像
pyvips是专为大图像设计的库,采用流式处理,内存占用极低,适合处理407MP这种级别的文件:
首先安装pyvips:
pip install pyvips
然后执行转换:
import pyvips # 以流式方式读取文件,避免加载整个图像到内存 image = pyvips.Image.new_from_file(path, access='sequential') # 保存为PNG,支持16位输出 image.write_to_file('image.png')
3. 提取DNG内置预览图(快速需求)
如果不需要全分辨率图像,可以直接提取DNG中的预览图,速度快且内存占用小:
import subprocess # 调用ExifTool提取预览图,需确保ExifTool已添加到系统PATH subprocess.run([ 'exiftool', '-b', '-PreviewImage', path, '-o', 'preview.png' ])
4. 使用OpenCV(需编译支持LibRaw)
如果你的OpenCV编译时包含了LibRaw支持,可以直接读取DNG并转换:
import cv2 # 读取16位DNG原始数据 img = cv2.imread(path, cv2.IMREAD_UNCHANGED) # 转换为8位用于PNG兼容(如需保留16位可直接保存) img_8bit = cv2.convertScaleAbs(img, alpha=(255.0 / 65535.0)) cv2.imwrite('image.png', img_8bit)
内容的提问来源于stack exchange,提问作者Oll
相关产品推荐
相关产品推荐

