如何在 c++ 或 python 中验证图像文件的完整性?

Posted

技术标签:

【中文标题】如何在 c++ 或 python 中验证图像文件的完整性?【英文标题】:How to verify the integrity of a image file in c++ or python? 【发布时间】:2011-10-06 13:01:03 【问题描述】:

我想检查图像是否已完全下载。有什么图书馆可以使用吗? 我要验证的图像包括各种格式,如 jpeg、png、bmp 等。

【问题讨论】:

“图像完整性”是指您要检查文件 Pic.jpeg 是否符合 JPEG 文件规范? 【参考方案1】:

在 Python 中此类事物的标准首选库是 Python Imaging Library (PIL)。

【讨论】:

【参考方案2】:

我使用 Pyhton Pillow 模块 (PIL) 和 Imagemagick 包装棒(用于 psd、xcf 格式)来检测损坏的图像,代码 sn-ps 的原始答案是 here。

我也在我的 Python 脚本 here on GitHub 中实现了这个解决方案。

我还验证了损坏的文件 (jpg) 通常不是“损坏”的图像,即损坏的图片文件有时仍然是合法的图片文件,原始图像丢失或更改但您仍然可以加载它。

为了完整性,我引用了完整的答案:

您可以使用 Python Pillow(PIL) 模块和大多数图像格式来检查文件是否是有效且完整的图像文件。

如果您还打算检测损坏的图像,@Nadia Alramli 会正确建议 im.verify() 方法,但这不会检测到所有可能的图像缺陷,例如,im.verify 不会检测截断的图像(大多数观看者加载时通常带有灰色区域)。

Pillow 也能够检测到这些类型的缺陷,但您必须应用图像处理或图像解码/重新编码或触发检查。最后我建议使用这段代码:

try:
  im = Image.load(filename)
  im.verify() #I perform also verify, don't know if he sees other types o defects
  im.close() #reload is necessary in my case
  im = Image.load(filename) 
  im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
  im.close()
except: 
  #manage excetions here

如果出现图像缺陷,此代码将引发异常。 请考虑 im.verify 比执行图像处理快大约 100 倍(我认为翻转是更便宜的转换之一)。 使用此代码,您将以大约 10 MBytes/sec(现代 2.5Ghz x86_64 CPU)验证一组图像。

对于其他格式psd,xcf,..可以使用Imagemagick包装器Wand,代码如下:

im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()

但是,根据我的实验,Wand 没有检测到截断的图像,我认为它会在没有提示的情况下将缺少的部分加载为灰色区域。

我发现 Imagemagick 有一个外部命令 identify可以 完成这项工作,但我还没有找到调用该函数的方法以编程方式,我还没有测试过这条路线。

我建议始终进行初步检查,检查文件大小不为零(或非常小),这是一个非常便宜的想法:

statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
  #manage here the 'faulty image' case

【讨论】:

【参考方案3】:

您可以通过尝试将图像加载到内存中来猜测(使用 PIL 或类似的方法),但有可能某些图像可以在不完整的情况下正常加载 - 例如,如果您有标题和动画的第一帧,您不会注意到动画的后面帧丢失了。

一种更可靠的方法可能是使用一些带外通信,例如,与其查看文件夹并在新文件存在时立即处理它们,不如找到某种方式连接到下载器进程并让它提供当它决定它准备好时,你会发出一个信号。

【讨论】:

以上是关于如何在 c++ 或 python 中验证图像文件的完整性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 或 Python 中快速将二进制文件划分为 6 字节块? [关闭]

如何使用 Ximea 在 C++ 中存储图像

使用 openCV 在 C++ 中查看灰度 RAW 图像文件

任何人都知道将图像划分为任意形状的 C++ 或 Python 库吗?

如何在 C++ 中使用 ZeroMQ 通信多个图像?

如何在纯c++环境中使用qt中的图像?