【问题标题】:How to guess image mime type?如何猜测图像 mime 类型?
【发布时间】:2013-01-16 16:21:36
【问题描述】:

如何在没有任何外部库的情况下以跨平台方式猜测图像的 mime 类型?

【问题讨论】:

  • 为什么不要求使用外部库?
  • 因为当您的案例很简单时,如果一个小型 sn-p 可以完成这项工作,则无需加载繁重的全功能库。
  • 外部库的执行方式可能与您最终在自己的代码中执行的方式完全相同。通过使用轻量级外部库,您可以避免编写代码并可能引入错误。我什至可以想象基于 C 库(例如 libmagic)的东西比用普通 Python 编写的东西更快更轻。

标签: python image cross-platform mime


【解决方案1】:

我查看了维基百科上流行的图片类型格式,并尝试签名:

def guess_image_mime_type(f):
    '''
    Function guesses an image mime type.
    Supported filetypes are JPG, BMP, PNG.
    '''
    with open(f, 'rb') as f:
        data = f.read(11)
    if data[:4] == '\xff\xd8\xff\xe0' and data[6:] == 'JFIF\0':
        return 'image/jpeg'
    elif data[1:4] == "PNG":
        return 'image/png'
    elif data[:2] == "BM":
        return 'image/x-ms-bmp'
    else:
        return 'image/unknown-type'

【讨论】:

  • 您可以通过解析 magic file 来重新实现部分 libmagic,而不是手动查找签名
  • 必须在二进制字符串比较之前添加'b'才能使其工作
【解决方案2】:

如果您可以依赖文件扩展名,则可以使用mimetypes.guess_type 函数。请注意,您可能会在不同平台上得到不同的结果,但我仍将其称为跨平台。

【讨论】:

  • 正如您所说,如果您可以依赖文件扩展名,这很有用。我最近使用了一些网络服务来向您发送没有文件名的原始图像数据,所以在这种情况下它是无用的。
【解决方案3】:

如果您事先知道您只需要处理有限数量的文件格式,您可以使用imghdr.what 函数。

【讨论】:

  • 不知道imghdr。太棒了。
猜你喜欢
  • 2016-02-08
  • 2016-06-19
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 2016-01-20
相关资源
最近更新 更多