是否有工具来检查一系列图像的文件完整性?


21

有时,当您下载映像时,如果连接中断,您会剩下一半的下载映像。如果尝试查看它,则会得到图像的上部,而下部通常是灰色或绿色或其他颜色。换句话说,它已损坏。

有没有一种方法可以检查图像是否已损坏或以其他方式损坏?

Answers:


15

如果您正在谈论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验证工具也是唯一利用这一点的方法。


您知道jpeginfo的Windows二进制文件是否存在吗?
2015年

1
在Windows上似乎无法通过git clone使用jpeginfo工具,因为'aux'似乎是Windows的保留名称,并且git无法将上述目录克隆为存在。
2015年

---从此处的其他帖子恢复对话;由于“ aux”,解压缩存档会出现错误。在存档中重命名“ aux”有助于解压缩,然后在cygwin中将其重命名为“ aux”解决了该问题。但是从cygwin运行make仍然导致许多错误。关于wrjpgcom.c:87:54的某些事情:警告:内置函数'exit'的不兼容隐式声明[默认启用] #define ERREXIT(msg)(fprintf(stderr,“%s \ n”,msg),退出(EXIT_FAILURE))(只是众多之一)
Rook

@ldigas我构建了一个MinGW二进制文件,您可以在mattdm.org/misc/jpeginfo-w32/jpeginfo.exe中找到。我在Linux上将其作为交叉编译的可执行文件构建,因此尚未对其进行测试,但它似乎可以构建。我不能保证它会起作用,但是我会保证它只是上游代码,没有病毒或任何东西。:)
mattdm 2015年

几分钟前就此进行了投票,以说明您正在付出的努力,但在Windows上似乎效果并不理想。jpeginfo -c any_jpeg_file.jpg我提供了它,似乎报告了JPEG文件的过早结尾JPEG数据流不包含图像[ERROR]。
鲁克

2

ImageVerifier完成了您想要的。不幸的是,它不再可供下载,并且支持已于2017年12月31日终止(请参阅Ingestamatic和ImageVerifier不再出售)。

由于历史原因的旧答案

ImageVerifier(简称IV)遍历文件夹的层次结构,以查找要验证的图像文件。它可以验证TIFF,JPEG。PSD,DNG和非DNG原始文件(例如NEF,CR2)。

IV设计用于处理大量图像。具有100,000张或更多图像的文件夹层次结构应该没有问题。在一次测试中,静脉输液运行了14个小时。

IV执行两种验证:结构检查和哈希检查。

http://basepath.com/site/detail-ImageVerifier.php


听起来好像您已与ImageVerifier关联,如果可以,请在答案中披露这一点。
该死的真相

1
我完全没有与该产品相关联。NAS崩溃后,我需要验证一些图像文件,并使用了此工具。我只是剪切了网站上的文字以提供描述。
Kez 2015年

FWIW-它适用于相机文件(jpg和各种RAW格式-主要用途),但不适用于其他没有编解码器的文件类型等。ImageMagick的-identify功能是另一种选择
Kez

1

如果这不是要从相机下载图像,而是要进行计算机到计算机的传输,则通常使用文件校验和来实现文件完整性。

不幸的是,据我所知,常见的“最终用户”图像格式(jpeg,png,gif,…)不是单独进行完整性检查的。但是据我所知,隐含着自动化处理的问题,将校验和工具(CRC32MD5等)集成到工作流中可能是一个可行的解决方案。存储校验和的一种常见方法是使文件具有相同的文件名,只是具有扩展名,例如:img123.jpg → img123.jpg.md5

这种方法的另一个好处是,您还可以检查(例如)sidecar文件或您想要以类似机制传输的任何其他文件的完整性。而且,即使在将来也保留校验和文件。(据我所知,它的缺点是没有集成到PS,LR或其他常用工具中。)


1
值得注意的是,DNG确实包含校验和,可以直接在Lightroom中进行验证。
汉普斯·尼尔森

我没有意识到!优秀。也有道理。我编辑了答案,以使我更明确地针对“最终用户”格式而不是档案格式,尽管DNG有助于校验和很不错。
Cornelius

我使用Irnis Haliullin的“高级校验和验证器”(ACSV)计算与原始文件一起复制到备份介质的MD5校验和文件。ACSV分批或交互式运行。可以随时通过重新计算校验和并将其与原始文件进行比较来验证副本的完整性。
Pierre

1

我开发了一个简单的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更加严格的方法,请告诉我。


0

可接受的答案是使用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次下载-可能是一个很好的指示。


典型的基于幻数的文件类型标识符通常仅关注前n个字节,因此这对于部分提交的图像文件可能无济于事,这是这里提出的问题的基础。也就是说,很常见的是JPEG或PNG,POSIX file(以相同的方式运行)可以正确报告,但是由于实际上丢失了许多数据而无法呈现。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.