我正在研究一个shell脚本,将MPO立体3D图像转换为标准JPEG图像。 MPO文件只是两个JPEG图像,连接在一起。
因此,您可以通过查找第二个JPEG幻数标题(0xFFD8FFE1)的字节偏移来拆分JPEG文件。我已经使用hexdump / xxd,grep,head和tail手动完成了这个。
这里的问题是grep:我可以使用什么来直接搜索二进制文件以获取特定的幻数,并获取字节偏移量?或者我不应该使用shell脚本吗?感谢。
答案 0 :(得分:7)
您可以使用bbe(http://bbe-.sourceforge.net/)执行此操作,这是一个类似二进制文件的程序:
为了提取第一个JPEG使用:
bbe -b '/\xFF\xD8\xFF\xE1/:' -e 'D 2' -o first_jpeg mpo_file
第二个:
bbe -b '/\xFF\xD8\xFF\xE1/:' -e 'D 1' -o second_jpeg mpo_file
请注意,如果JPEG的幻数出现在MPO文件的其他位置,则无法使用此功能。
答案 1 :(得分:3)
我认为巴特是您最大的问题。如果在此过程中重复使用二进制序列,您将获得部分JPEG。
我通过连接一些JPEG然后用awk提取它们进行了快速测试(请注意我的文件中的幻数以0xE0而不是0xE1结尾):
# for i in *.jpg ; do cat $i ; done > test.mpo
# awk 'BEGIN {RS="\xFF\xD8\xFF\xE0"; FILENUM=-1} {FILENUM++; if (FILENUM == 0) {next}; FILENAME="image0"FILENUM".jpg"; printf "%s",RS$0 > FILENAME;}' test.mpo
# file image0*.jpg
image01.jpg: JPEG image data, JFIF standard 1.01
image010.jpg: JPEG image data, JFIF standard 1.01
image011.jpg: JPEG image data, JFIF standard 1.01
这对我来说似乎没问题,但上面提到的问题仍然没有处理,而且非常真实。
答案 2 :(得分:0)
我认为一个非常简单的家酿方法将是您最好的选择。执行此操作的代码非常小,具体取决于二进制文件格式的所有特殊情况。
mmap
在内存中方便地查看文件。start
。end
。start
复制到end
到新文件中。答案 3 :(得分:0)
FFE1不是某些jpeg“幻数”的一部分,它是APP1标记。而且不能保证在SOI标记FFD8之后。此外,您应该小心一些jpeg图像将缩略图jpeg嵌入EXIF块中。这很可能也包含APP1标记。
答案 4 :(得分:0)
我在http://www.davidglover.org/2010/09/using-the-fuji-finepix-real-3d-w3-camera-on-a-mac-or-linuxunix.html找到了更好的MPO文件结构解释(以及如何正确处理)