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

时间:2014-07-10 19:13:42

标签: python magickwand wand

我想为RAW文件创建缩略图,但直接处理RAW文件非常慢。我想首先尝试从嵌入式JPG处理缩略图,并仅将RAW文件渲染为最后的手段。如何使用Wand提取嵌入式JPG?

2 个答案:

答案 0 :(得分:1)

RAW格式因设备和制造而异。通常,完整的图像传感器数据存储为带有JPEG预览的TIFF。可以更快地找到规范,而不是直接使用filestruct提取预览,而不是将完整文件加载到工具中。以下是Fujifilm's spec的示例。

 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)

现在将blob放入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

答案 1 :(得分:0)

如果您正在阅读佳能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')

我稍后可能会添加对其他原始格式的支持。拉请求欢迎。