python imghdr 检测图片类型

今天在写接口的时候,遇到一个问题,接口接收 Base64 编码的图片,然后保存到存储服务中,如何识别这个图片的格式呢?

  1. 调用接口时候,传递图片格式?
  2. 自动识别图片格式?

第一种方案,在QA测试的时候,会被提bug,测试用例是: 图片格式和传递的图片内容不一致,接口还能执行成功,测试不通过 :-<

第二种方案,就需要后端接口根据图片数据,自动识别图片格式。哈哈哈...,python 原生提供识别图片的库 imghdr,直接调用.....

识别图片文件的原理是,读取文件头部的一些标识,比如 jpg 格式的图片,二进制格式的第 6-10 为是 JFIF

这个库的源码行数很少,提供可用的方法也很少,主要用的方法就1个。

imghdr.what(filename, h=None)

其中:

  • filename 是文件名称,字符串类型
  • h 可选的,如果有内容,需要是图片内容 bytes,优先使用该图片数据
  • 源码中,提供test_xxx(...) 的方法,供检测具体的图片格式
  • 返回值:如果检测到返回具体的格式,否则返回 None

例如,识别 python 的 图标 py.png

py.png
import imghdr
import requests

# get image from python doc
img_data = requests.get('https://docs.python.org/3.7/_static/py.png').content

# Recognize image file formats
print(imghdr.what(None, img_data))

输出结果为 png

现在 python 3.7 中的 imghdr 支持 13 中图片格式的识别.

Value Image format Feature(文件头的字符从0开始计数)
'rgb' SGI ImgLib Files 前2个字符是 b'\001\332'
'gif' GIF 87a and 89a Files 前6为字符是 b'GIF87a' 或 b'GIF89a'
'pbm' Portable Bitmap Files 第一个字符是 b'P',第二个是 b'14' 任一个 第三个是 b' \t\n\r' 中任一个
'pgm' Portable Graymap Files 第一个字符是 b'P',第二个是 b'25' 任一个 第三个是 b' \t\n\r' 中任一个
'ppm' Portable Pixmap Files 第一个字符是 b'P',第二个是 b'36' 任一个 第三个是 b' \t\n\r' 中任一个
'tiff' TIFF Files 前2个字符是 b'MM' 或 b'II'
'rast' Sun Raster Files 前4个字符是 b'\x59\xA6\x6A\x95'
'xbm' X Bitmap Files 前8个字符是 b'#define '
'jpeg' JPEG data in JFIF or Exif formats 第 [6, 10) 字符是 b'JFIF' 或 b'Exif'
'bmp' BMP files 前2个字符是 b'BM'
'png' Portable Network Graphics 文件起始字符是 b'\211PNG\r\n\032\n'
'webp' WebP files 前4个字符是 b'RIFF' 第[8:12)是 b'WEBP':
'exr' OpenEXR Files 前4个字符是 b'\x76\x2f\x31\x01'

你可能感兴趣的:(python imghdr 检测图片类型)