如何确定照片是否已损坏?

时间:2011-02-28 06:14:57

标签: image delphi image-processing photo

我有一个要求,我必须确定照片是否已损坏,并据此将其标记为。

另一件事,我需要确定图像是否有错误的扩展名。我的意思是错误的扩展是有时我遇到了一张jpg扩展的照片,但是当我将这张照片加载到IrfanView时,它会报告照片的格式与扩展名不同。

如何在Delphi中执行此操作。

4 个答案:

答案 0 :(得分:14)

  

我有一个要求,我必须确定照片是否已损坏,并据此将其标记为。

你可以尝试一些东西,但是对于某些文件格式(例如:BMP,JPEG在某种程度上),只有人才能最终确定文件是否正常或已损坏。最简单的测试是简单地将文件加载到相应的对象(TJpegImage,TPngObject等)中。如果你在加载时遇到异常,你肯定有一个损坏的文件。不幸的是,如果没有引发异常,你就不能说文件没有被破坏。我已经看到损坏的JPEG文件可以很好地加载到Delphi TImage中并可以使用Windows的图像查看器打开,但显然已被人类观察者破坏。使用BMP图像,它甚至更清晰:打开位图,覆盖文件中间的一些字节,然后在查看器中打开它。任何自动化系统如何告诉位图中间错误颜色的位实际上是错误的?

  

另一件事,我需要确定图像是否有错误的扩展名。我的意思是错误的扩展是有时我遇到了一张jpg扩展的照片,但是当我将这张照片加载到IrfanView时,它会报告照片的格式与扩展名不同。

如何做同样的事情,尝试将文件加载到与其扩展名对应的对象中,如果失败,请尝试使用其他格式打开?这应该很容易。

或者,您可以调查图像标题:大多数文件格式都以短签名开头,几个字节。您可以查找所有图像文件格式的文档并查找签名,或者只需打开大量文件并在前4个字节中查找模式。我会选择第二种方法,因为找到所有图像文件格式的正确文档可能是一个挑战。

答案 1 :(得分:4)

由于您使用了“要求”一词,我怀疑您是在为某人工作,可能是作为合同。因此,在担心代码之前,请确保满足要求。

IMO,您需要获取测试用例的样本。正如其他人所提到的,未能将文件作为特定格式加载将是一次测试。但是,加载好的.jpg怎么样,但是底部三分之一丢失了?或者一个.jpg加载好但在中间有一个绿色的“静态”线,在某个地方上游发生错误(在相机,photoshop,等等),然后处理恢复并恢复?在这种情况下,.jpg可能确实有绿线。这被认为是“腐败”吗?这是你需要小心的地方,特别是如果它是一份合同工作。

答案 2 :(得分:3)

检查文件是否已损坏的唯一方法是尝试读取它,因为它以文件格式描述,即。将BMP作为BMP加载,读取BMP标题,BMP数据等。有许多网页描述图形文件格式。当然,如果你传输文件并担心它会在传输后被破坏,那么用CRC32,甚至加密MD5或SHA1等保存这些文件。然后在发送检查后,计算的总和是否与原始相同。

在Delphi中,单元jpeg和类型TJPEGImageTBitmap。尝试加载数据并检查异常。对于其他格式,有许多库,只需查找所需的文件格式。

要检查文件扩展名是否正常,请尝试读取文件的第一个字节并使用某些图形文件头字典进行检查。例如,GIF文件应以GIF开头,BMP文件以BM开头,而在JPEG标题中,您会找到JFIF。我认为unix实用程序file以这种方式工作。

答案 3 :(得分:0)

我已经通过阅读可疑图像并尝试使其形状来解决这种情况。该任务在try-except块内完成。以下是代码:

import cv2

image = cv2.imread('./image.jpg')

try:
    dummy = image.shape # this line will throw the exception
except:
    print("[INFO] Image is not available or corrupted.")

此方法应满足您的所有需求,例如:

  • 检测损坏的图像
  • 具有图像类型扩展名检测的非图像文件
  • 缺少图像检测等