6

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

4

3 回答 3

7

您可以尝试使用 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)

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

于 2012-08-21T09:40:40.223 回答
0

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

import Image

def is_image_ok(fn):
    try:
        Image.open(fn)
        return True
    except:
        return False
于 2012-08-21T09:07:06.957 回答
0

我不这么认为。

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

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

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

于 2012-08-21T09:08:57.610 回答