携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
之前没有注意到,图片格式竟然有这么多种;
- 'rgb' SGI 图像库文件
- 'gif' GIF 87a 和 89a 文件
- 'pbm' 便携式位图文件
- 'pgm' 便携式灰度图文件
- 'ppm' 便携式像素表文件
- 'tiff' TIFF 文件
- 'rast' Sun 光栅文件
- 'xbm' X 位图文件
- 'jpeg' JFIF 或 Exif 格式的 JPEG 数据
- 'bmp' BMP 文件
- 'png' 便携式网络图像
- webp' WebP 文件
- 'exr' OpenEXR 文件
其中最常见的是png和jpeg了,通常都是通过文件名后缀来判断图片格式,但是都知道,这个后缀可以随意更改,不太准;
python内置了一个检测图片格式的库:
imghdr
imghdr是一个用来检测图片类型的模块,提供了一个api叫做
imghdr.what
传递给它的可以是一个文件对象,也可以是一个字节流; 然后防护一个图片格式;
参考imghdr的源码发现,其对图片做了一次遍历检测,看最终匹配到哪个结果;
tests = []
def test_jpeg(h, f):
"""JPEG data in JFIF or Exif format"""
if h[6:10] in (b'JFIF', b'Exif'):
return 'jpeg'
tests.append(test_jpeg)
def test_png(h, f):
if h.startswith(b'\211PNG\r\n\032\n'):
return 'png'
tests.append(test_png)
def test_gif(h, f):
"""GIF ('87 and '89 variants)"""
if h[:6] in (b'GIF87a', b'GIF89a'):
return 'gif'
tests.append(test_gif)
简单使用;
imgdr是内置库,所以不需要安装,直接导入即可
import imghdr
imghdr.what()可以接收一个文件路径,也可以接收一个文件对象。输出一个文件类型
- 代码参考如下:
import imghdr
img = 'H://sz-1.png'
print(imghdr.what(img))
with open(img,'rb') as f:
type = imghdr.what(f)
print(type)
以上代码实用性不强,但是如果给imghdr,what的是一个url地址,然返回一个文件类型。就很有用途,比如在爬虫下载文件的时候,图片是一个gif类型,下载的时候保存成png或jpg文件,就不对了;
例如这个地址是一个百度图片地址, t7.baidu.com/it/u=251198… 从地址上看不出文件类型,保存时就不知道后缀是啥了;
如果可以知道文件类型,在下载时就可以指定文件后缀名称;不至于将gif保存成png;
代码如下:
import imghdr
import requests
# https://t7.baidu.com/it/u=2511982910,2454873241&fm=193&f=GIF
reponse = requests.get('https://t7.baidu.com/it/u=1595072465,3644073269&fm=193&f=GIF')
type = imghdr.what(None,reponse.content)
print(type)
with open('H://1.'+type,'wb') as f:
f.write(reponse.content)
因为要请求图片,需要用到requests这个库;
requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,Requests是Python语言的第三方的库,专门用于发送HTTP请求
安装方式推荐使用pip
pip 是 Python 的包安装程序。其实,pip 就是 Python 标准库(The Python Standard Library)中的一个包,只是这个包比较特殊,用它可以来管理 Python 标准库(The Python Standard Library)中其他的包。pip 是一个命令行程序。 安装 pip 后,会向系统添加一个 pip 命令,该命令可以从命令提示符运行。
安装requests命令如下:
pip install requests
库比较简单,等待安装完成即可;
运行代码,检测图片类型;