用Python的MagickWand从RAW文件中提取嵌入的JPG

0 投票
2 回答
2396 浏览
提问于 2025-04-18 12:50

我想为RAW文件创建缩略图,但直接处理RAW文件非常慢。我想先尝试从嵌入的JPG中处理缩略图,只有在必要时才处理RAW文件。请问我该如何使用Wand提取嵌入的JPG呢?

2 个回答

0

如果你正在处理Canon的CR2文件,我写了一个叫做 rawphoto 的库,你可以使用它(这个库也可以在 pypi 上找到)。

要提取缩略图,你可以这样做:

from rawphoto.raw import Raw
from wand.image import Image

with Raw(filename="example.CR2") as rawfile:
    blob = rawfile.fhandle.get_thumbnail()
// Do something with your JPEG thumbnail, eg. convert it to a PNG with Wand:
with Image(blob=blob) as image:
    image.format = 'png'
    image.save(filename='someimage.png')

我可能会在以后添加对其他原始格式的支持。欢迎提交请求。

0

RAW格式在不同的设备和制造商之间是有差异的。通常,完整的图像传感器数据会以TIFF格式存储,并附带一个JPEG预览图。与其把整个文件加载到工具里,不如直接查找规格说明,利用filestruct提取预览图,这样可能会更快。这里有一个关于富士相机规格的例子。

 from struct import unpack

 fd = file('source.raf','rb')
 # Skip over header + directory
 # See manufacture specification
 offset  = 16 # Magic bytes
 offset += 12 # Version
 offset += 32 # Camera name
 offset += 24 # Directory start & meta
 fd.seek(offset, 0)
 jpeg_offest = unpack('i', fd.read(4)) # Read where JPEG data starts
 jpeg_length = unpack('i', fd.read(4)) # Read size of JPEG data
 fd.seek(jpeg_offset, 0)
 jpg_blob = fd.read(jpeg_length)

现在把这个数据块放入wand,或者直接使用RAW图像。

 from wand.image import Image

 if jpeg_blob:
     img = Image(blob=jpg_blob)
 else:
     img = Image(filename='source.raf')

这个方法适用于所有RAW数据都是按照同一制造商的规格生成的情况。如果不是,你就需要为每个规格建立文件配置文件,并检查每个RAW文件的魔法字节,以确定JPEG数据的位置。整个流程可能看起来像这样……

dot file

撰写回答