【问题标题】:Is there a way to determine in Python (or other language) to see if a JPG image is corrupt?有没有办法在 Python(或其他语言)中确定 JPG 图像是否损坏?
【发布时间】:2012-08-16 14:14:11
【问题描述】:

我想知道是否有办法在 Python(或其他语言)中确定打开 JPEG 文件,并确定它是否已损坏(例如,如果我在 JPG 文件完成之前终止下载,然后我无法打开文件并查看它)?是否有可以轻松完成此操作的库?

【问题讨论】:

  • 可能是因为它与stackoverflow.com/questions/889333/…重复
  • 谢谢列夫!发布重复问题的链接不是比投反对票更好吗? -_- 我试图寻找答案,但我似乎没有上述问题。
  • 我不是反对者,所以可能还有其他原因。也许有人在这个问题上没有找到足够的努力(没有代码,也没有链接)。无论如何,一个反对票并不总是一个大问题。如果可以的话,记得根据How to Ask改进你的问题。
  • @Raymond:您的问题表明缺乏研究工作。
  • 似乎对potential duplicate 的回复有所不同,而且 - 在我的情况下 - 没有这里的回复有用。出于这个原因要投票。

标签: python image file


【解决方案1】:

您可以尝试使用 PIL。但是仅仅打开一个截断的 JPG 文件不会失败,verify 方法也不会失败。但是,尝试加载它会引发异常;

首先我们修改一个好的 jpg 文件:

> du mvc-002f.jpg
56  mvc-002f.jpg
> dd if=mvc-002f.jpg of=broken.jpg bs=1k count=20
20+0 records in
20+0 records out
20480 bytes transferred in 0.000133 secs (154217856 bytes/sec)

然后我们试试 Python Imaging Library:

>>> import Image
>>> im = Image.open('broken.jpg')
>>> im.verify()
>>> im = Image.open('broken.jpg')  # im.verify() invalidates the file pointer
>>> im.load()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/PIL/ImageFile.py", line 201, in load
    raise IOError("image file is truncated (%d bytes not processed)" % len(b))
IOError: image file is truncated (16 bytes not processed)

正如 user827992 所说,即使是截断的图像通常仍然可以部分解码和显示。

【讨论】:

  • im.show() 也有助于发现异常。它实际上使用默认的 OS img 查看器打开文件,如果失败,它将引发 OSError: broken data stream when reading image file
  • load 例程似乎是我能找到的检查图像是否损坏的唯一简单方法。
【解决方案2】:

我不这么认为。

JPEG 标准更像是一个容器,而不是关于实现的标准。

“损坏”这个词通常意味着文件不再代表原始数据但大部分时间仍然可以解码,它会产生一个未定义的输出,不是应该产生的输出,而是最常放入 JPEG 解码器它可能会输出一些东西,因为没有办法将唯一的位排列与 JPEG 文件格式相关联,你不能以编程方式执行此操作,你没有特定的模式,即使你有它也可以'仅解析实际文件时,不知道原始内容是什么,就说有点是错误的地方或丢失。

文件的标题也可能损坏,但在这种情况下,您的文件可能被指定为损坏而不关心“是什么”,像任何通用文件一样损坏。

【讨论】:

    【解决方案3】:

    你可以使用 PIL 包来做到这一点:

    import Image
    
    def is_image_ok(fn):
        try:
            Image.open(fn)
            return True
        except:
            return False
    

    【讨论】:

    • 打开文件并不总是足以检测文件损坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 2022-01-13
    • 2019-08-23
    • 2013-07-16
    • 2014-12-08
    • 2017-09-28
    相关资源
    最近更新 更多