PIL模块 - Python图像处理 目录树

PIL模块 - Python图像处理
来自http://www.tpleina.com/2019/05/2487951348.html
介绍PIL、Pillow
PIL(Python Imaging Library)是Python图像处理库,PIL模块于2009年9月发布,最新版本是1.1.7,仅支持Python1.5.2 - 2.7
目前PIL项目已经停止开发,最后一次更新是在2011年
强调一下:PIL不支持Python3.x
而Pillow也是Python的图像处理库,与PIL区别:Pillow是PIL特定版本Fork代码,Pillow兼容PIL绝大多数用法,开发活跃,更主要是Pillow库支持Python3.x,所以推荐使用Pillow
现在说的PIL,一般都指Pillow,包括文章下面说的PIL,都是Pillow模块
本节使用演示图片:
- 图片大小:1680x1050
- 图片格式:JPEG
- 图片颜色模式:RGB
Image类
Image是PIL最重要的类,PIL大部分功能都是从Image类实例开始的
Image实例有5个属性:
- format : 返回图像格式(PNG,JPG,…),如果图像不是从文件读取的,则值None
- mode : 返回图像的模式,常用模式有:
- L (luminance) 灰度图像,8位像素,表示黑和白
- RGB 3x8位像素,为真彩色图像
- RGBA 4x8位像素,有透明通道的真彩色
- CMYK 4x8位像素,颜色分离,出版图像
- P 8位像素,使用调色板映射到其他模式
- 1 1位像素,表示黑和白,但是存储的时候每个像素存储为8bit
- YCbCr:3x8位像素,彩色视频格式
- I 32位整型像素
- F 32位浮点型像素
- PIL支持一些特殊的模式,包括RGBX(有padding的真彩色)和RGBa(有自左乘alpha的真彩色)
- size : 是一个二元tuple,包含width和height(宽度和高度,单位是px)
- palette : 仅当 mode 为 P 时有效,返回 ImagePalette 实例
- info : info信息,返回/设置图像一些额外信息,一个字典结构对象
示例代码
# -*- coding:utf-8 -*-
from PIL import Image
if __name__ == '__main__':
# 打开图片
im = Image.open('xiana.jpg')
# 得到图片大小
print(im.size)
# 图片格式
print(im.format)
# 图片色彩模式
print(im.mode)
# 返回 ImagePalette 实例
print(im.palette)
# 实例信息(dict)
print(im.info)
# 打开,并查看图片
im.show()
说一下最后一个方法show()
查看图片,原理是将图片暂存为一个临时文件,然后调用操作系统默认图片浏览软件打开图片文件
Pillow库不会直接解码或者加载全部图像数据
当用Image.open打开一个图片文件,只会读取文件头信息来确定格式、颜色模式、大小等,文件其他数据不会处理,这种方式保证了图片操作性能
可以说Image.open是一个懒操作(只读文件头信息,直到图像操作才会读取整个图像数据),因此调用load()方法可以强行加载图像数据
额外说一下“通道”概念
每张图片都是由一个或多个数据通道构成,例如RGB图像是由三个数据通道构成,分别为R、G和B通道
获得图片通道数及通道名称:Image.getbands()
图像操作
创建缩略图
Image.thumbnail()
方法可以制作缩略图,接受一个二元数组作为缩略图的尺寸,然后将实例图片缩小到指定尺寸
生成JPG缩略图,示例如下:
# -*- coding:utf-8 -*-
from PIL import Image
if __name__ == '__main__':
# 打开图片
im = Image.open('xiana.jpg')
print(im.size)
x, y = im.size
# 缩略图大小
im.thumbnail((x//2, y//2))
print(im.size)
# 打开,查看图片
im.show()
裁剪图片
Image.crop()
能从图像中提取一个子矩形选区
Pillow库以图像左上角为坐标原点 (0,0),矩形选区区域由一个元组决定,元组信息包括 (左,上,右,下) 的坐标
裁剪图片示例:
# -*- coding:utf-8 -*-
from PIL import Image
if __name__ == '__main__':
# 打开图片
im = Image.open('test.png')
# (左,上,右,下)
selected = (610,140,1100,820)
# 得到400x680px图片