Answers:
如果您正在谈论JPEG文件,那么实用jpeginfo正是您所需要的。它可以检查文件中不同类型的JPEG错误和损坏,并返回错误代码(对于脚本编写最有用的东西),或者仅删除有错误的文件。
我将其用作初始文件传输的一部分,以确保所有内容都可以正常复制而无需依靠手动检查。(在那之后,我确保他们的校验和不会作为我的常规备份/位保护的一部分而改变。)
该程序是命令行程序,并作为源代码提供,但是应该易于在任何Linux发行版或具有正确设置的开发环境的Mac上构建和使用。我相信您甚至可以在Windows上使用Cygwin或MinGW做到这一点。(例如,尽管我不能保证它的完整性,但此博客文章似乎合法,并包含预编译的下载。)要自己构建它:
$ git clone https://github.com/tjko/jpeginfo.git
Cloning into 'jpeginfo'...
[...]
Checking connectivity... done
$ cd jpeginfo/
$ ./configure && make
这将创建一个jpeginfo
命令,您可以在其中运行该命令,也可以将其复制到所需的位置(可能使用make install
)。
然后,您可以这样运行它:
$ ./jpeginfo -c *.jpg
test1.jpg 1996 x 2554 24bit Exif P 6582168 [OK]
test2.jpg 1996 x 2554 24bit Exif P 6582116 Premature end of JPEG file [WARNING]
test3.jpg Corrupt JPEG data: 1 extraneous bytes before marker 0xe2 1996 x 2554 24bit Exif P 6582169 [WARNING]
在这里,test1.jpg非常好,而test2.jpg我从末尾删除了几个字节,而test3.jpg我更改了标头中的一些随机字节。
如果您有RAW文件,请查看美国媒体摄影师协会的DNG验证页面,或有关数据验证详细信息的页面,其中涉及使用Adobe的DNG转换器批量验证专有RAW格式。(不幸的是,这是GUI操作,不一定易于编写脚本。)
如果您有一台本机输出1.2版本DNG的摄像机,那就更好了,因为它包括图像数据的内置MD5校验和。不幸的是,这似乎没有与普通的图像元数据一起存储-或至少exiftool和exiv2无法识别它,并且它们通常读取1.2 DNG文件-这意味着据我所知,目前Adobe验证工具也是唯一利用这一点的方法。
ImageVerifier完成了您想要的。不幸的是,它不再可供下载,并且支持已于2017年12月31日终止(请参阅Ingestamatic和ImageVerifier不再出售)。
ImageVerifier(简称IV)遍历文件夹的层次结构,以查找要验证的图像文件。它可以验证TIFF,JPEG。PSD,DNG和非DNG原始文件(例如NEF,CR2)。
IV设计用于处理大量图像。具有100,000张或更多图像的文件夹层次结构应该没有问题。在一次测试中,静脉输液运行了14个小时。
IV执行两种验证:结构检查和哈希检查。
如果这不是要从相机下载图像,而是要进行计算机到计算机的传输,则通常使用文件校验和来实现文件完整性。
不幸的是,据我所知,常见的“最终用户”图像格式(jpeg,png,gif,…)不是单独进行完整性检查的。但是据我所知,隐含着自动化处理的问题,将校验和工具(CRC32,MD5等)集成到工作流中可能是一个可行的解决方案。存储校验和的一种常见方法是使文件具有相同的文件名,只是具有扩展名,例如:img123.jpg → img123.jpg.md5
。
这种方法的另一个好处是,您还可以检查(例如)sidecar文件或您想要以类似机制传输的任何其他文件的完整性。而且,即使在将来也保留校验和文件。(据我所知,它的缺点是没有集成到PS,LR或其他常用工具中。)
我开发了一个简单的python脚本check_media_integritycheck_mi.py
,您可以从GitHub下载它:
https://github.com/ftarlao/check-media-integrity
我引用了指南介绍:
check-mi是Python 2.7脚本,可自动检查媒体文件(图片,视频,音频)的完整性。您可以递归检查单个文件的完整性,也可以递归检查文件夹和子文件夹中的文件集的完整性,最后可以选择以CSV格式输出错误文件列表及其路径和详细信息。
该工具使用通用库(Pillow,ImageMagik,FFmpeg)测试文件完整性,并检查它们何时能够有效解码媒体文件。警告,图像,音频和视频格式对于缺陷和损坏非常有弹性,因此该工具无法检测到所有损坏的文件。
check-mi可以100%放心地发现标头/元数据损坏的文件,截断的图像文件(strict_level> 0)和设备I / O错误。
通常,check-mi无法检测到所有较小的损坏,例如,媒体文件的一小部分被不同的值覆盖。详细地说,我已经通过一个小型随机实验测试了strict_level 1,该实验在一张5MB jpeg图片上执行:
用零覆盖图像文件的一部分(间隔),您需要间隔大小= 1024KBytes,以便有50%的机会检测到损坏。以4096字节至1024 KB的间隔大小覆盖具有不同随机值的图像文件的一部分(间隔),可获得大约85%的检测率。
如果您知道在解码时指示Pillow,Wand和FFmpeg更加严格的方法,请告诉我。
可接受的答案是使用jpeginfo,它是用C编写的非常老旧且无需维护的工具(并且也不是非常模块化/可扩展的)。另外,该工具似乎只是在寻找一些特定的EXIF数据点(在源代码中略过约5分钟)。
IMO是一种更好的工具,称为file-type,非常易于使用-如果您不知道如何编码,基本上可以将其示例代码复制粘贴并修改文件名。它检查与某些已知文件类型相关的幻数,并让您知道要处理的文件类型。
我仍在寻找更多的保护层,而不仅仅是这个。例如,如果任意数据存储在EXIF元数据之后(或之中)或在幻数之后,则可能会带来安全问题。我将继续研究更多的安全措施,并希望以后再更新此答案。
这是从他们的网页复制的示例代码,用于懒惰:
// Node.js
const readChunk = require('read-chunk');
const fileType = require('file-type');
const buffer = readChunk.sync('unicorn.png', 0, fileType.minimumBytes);
fileType(buffer);
//=> {ext: 'png', mime: 'image/png'}
仅供参考,此工具正在不断更新(3天前是最后一次更新,按照我的原始回答),目前每周有3,691,850次下载-可能是一个很好的指示。