今天在写接口的时候,遇到一个问题,接口接收 Base64 编码的图片,然后保存到存储服务中,如何识别这个图片的格式呢?
- 调用接口时候,传递图片格式?
- 自动识别图片格式?
第一种方案,在QA测试的时候,会被提bug,测试用例是: 图片格式和传递的图片内容不一致,接口还能执行成功,测试不通过 :-<
第二种方案,就需要后端接口根据图片数据,自动识别图片格式。哈哈哈...,python 原生提供识别图片的库 imghdr,直接调用.....
识别图片文件的原理是,读取文件头部的一些标识,比如 jpg
格式的图片,二进制格式的第 6-10 为是 JFIF
。
这个库的源码行数很少,提供可用的方法也很少,主要用的方法就1个。
imghdr.what(filename, h=None)
其中:
- filename 是文件名称,字符串类型
- h 可选的,如果有内容,需要是图片内容 bytes,优先使用该图片数据
- 源码中,提供
test_xxx(...)
的方法,供检测具体的图片格式 - 返回值:如果检测到返回具体的格式,否则返回 None
例如,识别 python 的 图标 py.png
py.pngimport 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' |
网友评论