一日一技:如何识别一张图片的格式

开发 前端
在有些时候,我们拿到了一张图片的二进制数据,但却不知道这张图片应该是什么格式。

[[381761]]

在有些时候,我们拿到了一张图片的二进制数据,但却不知道这张图片应该是什么格式。例如,某个 HTTP接口返回给你一段 Base64编码的图片数据,如下图所示:

 

这段 Base64编码的数据,实际上对应了下面这种图片:

[[381762]]

 

那么问题来了,这张图片的格式是 JPG 还是 PNG?是 BMP 还是只有一帧的 GIF?

还有一些网站,他们的图片URL 格式类似于:https://www.kingname.info/xx/yy/zz,在 URL 中没有显示图片的格式。那么,当你用爬虫把这个图片下载下来以后,应该怎么保存呢?

虽然在大部分情况下,你确实可以把一张 PNG 格式的图片保存成 JPG,在电脑上也能双击打开看。但如果你要写一些程序来处理图片,那么图片的格式就至关重要了。例如 GIF 里面有帧信息,而JPG 里面却没有,PNG 图片有通道信息,而 JPG 也没有。如果你下载了一张JPG 的图片,却尝试用处理 GIF 的方式去提取帧信息,显然就会导致程序报错。

为了解决这个问题,你可以使用 Pillow 这个常见的图片处理库。它可以很容易识别一张常见格式图片的格式。

我们可以使用如下的命令来安装 Pillow:

  1. python3 -m pip install pillow 

安装完成以后,我们使用PIL导入图片处理的模块Image:

  1. from PIL import Image 
  2.  
  3. img = Image.open('/Users/kingname/Dropbox/50e452c3504a6.jpg'
  4. print(img.format) 

运行效果如下图所示:

 

成功把一张 JPG 格式识别为了 JPEG(JPG、JPEG 是同一个东西)。但显然,我们大多数情况下,图片是以二进制的形式存放到内存中的,而不是放在硬盘中。但Image.open()接收的参数是一个文件地址。我们需要让 Pillow 从内存中读取图片数据,生成图片对象以后,查看它的.format属性。

这个时候,就可以使用io模块,把二进制的数据包装成一个假的二进制文件句柄:

  1. import io 
  2. import base64 
  3. from PIL import Image 
  4.  
  5. img_base64 = '图片对应的 base64' 
  6. img_byte = base64.b64decode(img_base64.encode()) 
  7. img_io = io.BytesIO(img_byte) 
  8. img = Image.open(img_io) 
  9. print(img.format) 

运行效果如下图所示:

 

这样一来,我们就成功识别了一张未知图片的格式了。

本文转载自微信公众号「未闻Code」,可以通过以下二维码关注。转载本文请联系未闻Code公众号。

 

责任编辑:武晓燕 来源: 未闻Code
相关推荐

2021-10-15 21:08:31

PandasExcel对象

2022-06-28 09:31:44

LinuxmacOS系统

2022-03-12 20:38:14

网页Python测试

2021-04-27 22:15:02

Selenium浏览器爬虫

2023-10-28 12:14:35

爬虫JavaScriptObject

2024-07-30 08:16:18

Python代码工具

2024-07-30 08:11:16

2024-11-11 00:38:13

Mypy静态类型

2021-05-08 19:33:51

移除字符零宽

2022-03-07 09:14:04

Selenium鼠标元素

2021-04-05 14:47:55

Python多线程事件监控

2024-11-13 09:18:09

2020-12-11 06:30:00

工具分组DataFrame

2023-10-29 09:16:49

代码安全命令

2021-05-13 09:01:51

Cloud Flare浏览器网站

2021-04-12 21:19:01

PythonMakefile项目

2024-02-20 22:13:48

Python项目Java

2024-08-27 22:08:13

2020-05-19 13:55:38

Python加密密码

2021-09-13 20:38:47

Python链式调用
点赞
收藏

51CTO技术栈公众号