imghdr / python - 无法检测某些图像的类型(图像扩展名)

Hyp*_*ion 4 python image imghdr

我正在使用 Python 脚本从 imgur.com 下载大量图像,并且由于我拥有格式中的所有链接,因此http://imgur.com/{id}我必须通过将原始 url 替换为 来强制下载它们http://i.imgur.com/{id}.gif,然后保存所有图像而无需扩展名。(我知道有一个 Imgur 的 API,但我不能使用它,因为它对这种工作有限制)

现在在下载图像后,我想使用 imghdr 模块来确定图像的原始扩展名:

>>> import imghdr
>>> imghdr.what('/images/GrEdc')
'gif'
Run Code Online (Sandbox Code Playgroud)

问题是这成功率为 80%,其余 20% 都被识别为'None'并检查其中一些我注意到它们很可能都是 .jpg 图像。

为什么imghdr无法检测格式?即使没有扩展,我也可以使用 Ubuntu 的默认图像查看器打开这些图像,所以我认为它们没有损坏。

Sim*_*mon 6

请注意,在 2019 年,此错误尚未修复。该解决方案可从 Paul R.

解决问题的一种方法是对问题进行monkeypatch:

# Monkeypatch bug in imagehdr
from imghdr import tests

def test_jpeg1(h, f):
    """JPEG data in JFIF format"""
    if b'JFIF' in h[:23]:
        return 'jpeg'


JPEG_MARK = b'\xff\xd8\xff\xdb\x00C\x00\x08\x06\x06' \
            b'\x07\x06\x05\x08\x07\x07\x07\t\t\x08\n\x0c\x14\r\x0c\x0b\x0b\x0c\x19\x12\x13\x0f'

def test_jpeg2(h, f):
    """JPEG with small header"""
    if len(h) >= 32 and 67 == h[5] and h[:32] == JPEG_MARK:
        return 'jpeg'


def test_jpeg3(h, f):
    """JPEG data in JFIF or Exif format"""
    if h[6:10] in (b'JFIF', b'Exif') or h[:2] == b'\xff\xd8':
        return 'jpeg'

tests.append(test_jpeg1)
tests.append(test_jpeg2)
tests.append(test_jpeg3)
Run Code Online (Sandbox Code Playgroud)


Rau*_* R. 3

这是库中的一个已知问题,它无法检测到一些有效的JPEG图像。

您可以使用对库的修改来更好地检测所有 JPEG 图像,特别是在您确定所有文件都是图像的情况下。

https://bugs.python.org/issue28591

如果即使使用这个固定库,您也无法检测到某些图像,那么您可以尝试使用支持更多格式但不太轻量级的Pillow,并且是不包含在 python 内置库中的外部依赖项。