用Python的MagickWand从RAW文件中提取嵌入的JPG
我想为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预览图。与其把整个文件加载到工具里,不如直接查找规格说明,利用file
和struct
提取预览图,这样可能会更快。这里有一个关于富士相机规格的例子。
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数据的位置。整个流程可能看起来像这样……