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

标签 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'

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

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

最佳答案

请注意,在 2019 年,此错误尚未修复。该解决方案可在 Paul R 的链接中找到。

克服这个问题的一种方法是猴子修补问题:

# 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)

关于python - imghdr/python - 无法检测某些图像的类型(图像扩展),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36870661/

相关文章:

c# - 从路径名获取图像对象

python - 识别文件格式

python - 如何检查文件是否是有效的图像文件?

python - 如何使用初始数据点将曲线拟合到曲线数据集?

python - Pyspark 数据框将多列转换为 float

python - 如何在具有可变小数位数的python中格式化小数

python - Odoo - 编辑某些空值字段时发出警告

python - 如何使用 OpenCV 在图像上标记数字并绘制圆圈

html - 覆盖图像的背景不透明度