首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >imghdr / python -无法检测某些图像的类型(图像扩展名)

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

Stack Overflow用户
提问于 2016-04-27 00:29:05
回答 2查看 2.5K关注 0票数 4

我用Python脚本从imgur.com下载了很多图片,因为我有http://imgur.com/{id}格式的所有链接,所以我必须用http://i.imgur.com/{id}.gif替换原始的url,然后保存所有的图片而不带扩展名。(我知道有Imgur的API,但我不能使用它,因为它对这种工作有限制)

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

代码语言:javascript
复制
>>> import imghdr
>>> imghdr.what('/images/GrEdc')
'gif'

问题是,这种方法的成功率为80%,剩下的20%都被识别为'None',检查其中一些图像时,我注意到它们最有可能都是.jpg图像。

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

EN

回答 2

Stack Overflow用户

发布于 2019-08-28 21:03:52

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

克服这个问题的一个方法是使用monkeypatch来解决这个问题:

代码语言:javascript
复制
# 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)
票数 6
EN

Stack Overflow用户

发布于 2018-08-02 09:07:57

在通过MIMEImage类创建邮件附件时,我遇到了问题,并显示了错误(以googlefood为例):

代码语言:javascript
复制
  File "/usr/lib/python2.7/email/mime/image.py", line 43, in __init__
    raise TypeError('Could not guess image MIME subtype')
TypeError: Could not guess image MIME subtype

原因是MIMEImage在内部依赖于(buggy) imghdr.what。

代码语言:javascript
复制
    if _subtype is None:
        _subtype = imghdr.what(None, _imagedata)
    if _subtype is None:
        raise TypeError('Could not guess image MIME subtype')

我可以使用guess_type来绕过这个问题:

代码语言:javascript
复制
from email.mime.image import MIMEImage
from mimetypes import guess_type
(mimetype, encoding) = guess_type(image)
(maintype, subtype) = mimetype.split('/');
fp = open(os.path.join(dirpath, image), 'rb')
mimeimage = MIMEImage(fp.read(), **{'_subtype': subtype})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36870661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档