PIL是一个功能非常强大的第三方图像处理库,它可以转化图像格式、创建缩略图、显示图像、截取图像、翻转或旋转图片等等;原本PIL是只支持python2的,后来出现了移植到python3的pillow,其功能与PIL相似,所以这里需要注意。
一、安装PIL
pip install pillow
我在安装的时候出现了网络延迟报错等情况,总之锲而不舍,多试几次,或者换个时间再来,前提是命令不要出错;
二、PIL的核心类——Image
Image是PIL的核心类,里面存储了PIL处理的必须参数和基础方法,接下来我们就通过这个类对图像进行初步处理;
- open(文件路径)方法,返回一个图片对象
from PIL import Image # 导入Image库 img = Image.open('logo.png') # 打开图像文件,返回Image对象 print(img) # 输出文件对象信息 ''' PngImageFile 图像格式 mode=1 色彩模式 size=1540x1540 图像分辨率 ''' print('图像格式:',img.format) print('图像分辨率:',img.size) print('图像模式:',img.mode) # 输出结果: # <PIL.PngImagePlugin.PngImageFile image mode=RGBA size=400x400 at 0x17066924F28> # # 图像格式: PNG # # 图像分辨率: (400, 400) # # 图像模式: RGBA
从上面我们可以知道Image对象有format、size和mode三个属性:
format属性表示图像的格式,我们常见的有JPG、PNG等
size属性即为图片的分辨率,用像素表示
mode属性定义了像素类型、颜色深度等等,这一块涉及到的原型比较复杂,后面再慢慢理解,现在只需要知道的是:L表示灰度图像、RGB表示真彩图像、CMYK表示预先压缩的图像;上面的RGBA,最后的A表示Alpha(色彩空间)色彩模式 模式 说明 1 1位像素,非黑即白,没有灰度之说,0表示黑,255表示白(一般来说我们生成的二维码就是1模式);但是存储占用8Bit L 8位像素,与1模式相比,L模式有了灰度的变化,即可以表示黑白照片了;
RGB模式转L模式公式(注意:最后会取整):R*0.299+G*0.587+B*0.114
P 8位像素,对应的颜色值是按照调色板查询出来的,所以也可以使用调色板映射到其他模式 RGB 3*8位像素,真彩色图像,用R、G、B三个通道组合而成,每隔通道用8Bit存储,可理解成三原色模式
RGBA 4*8位像素,真彩色+透明通道,在RGB模式的基础上加上了一个Alpha(透明通道),如果从RGB转到RGBA,默认A为255,即为完全不透明 CMYK 4*8位像素,出版图像,一般印刷用这个模式较多 YCbCr 3*8位像素,彩色视频格式 I 32位整型灰度图像,我们可以理解成,这个是L模式的进阶版 F 32位浮点型像素,这个在I模式的基础上保留了小数部分 - OK,讲到这里,有必要理解一下一张照片是怎么显示图像的,我们先来看下下面这张图片:
这是一张照片放大之后的截图,我们可以看见放大之后流畅的线条消失了,取而代之的是一个一个小方块,玩过我的世界的朋友可能知道,我的世界其实就是一个像素世界,所有的东西都是由方块构成的;
那么图片也是一样,它其实就是由一个一个小的像素点构成的,只不多我们现在的分辨率非常高,基本的1024*768,横向有1024个像素点,纵向有768个像素点,缩小成一张照片,我们肉眼就很难分别了;
那么每一个像素点都有一个值,我们最常使用的就是用RGB表示颜色,当这些颜色都铺满整个画面的时候,就构成了一个图像,这个就是图像的显示原理;
现在有一种隐写术,就是可以用图片作为介质,隐藏我们需要保存的数据,他是怎么实现的呢?我们知道一个像素点是由RGB三个通道构成,一个通道占8bit,假设我将最后一位清空用于保存我们的数据,那么一个1024*768的图片就有1024*768*3=2,359,296bit的空间给我们保存数据,即可以保存1024*768*3/8/1024=288kb的数据;那么这样不会破坏原来的照片嘛,会,但是颜色的差别微乎其微,我们的肉眼根本分辨不出来,这样我们就可以将信息以其他载体隐藏起来啦。 - show()方法,显示图像
这个方法非常简单,会用系统默认图片浏览器打开图片; -
save(文件路径,后缀名)方法,保存指定格式的图像
将此图像保存在给定的文件名下, 如果未指定格式,则尽可能使用文件名扩展名确定要使用的格式; -
transpose(翻转模式)方法,翻转图像
通过原型,我们可以知道翻转模式有以下几种:
Image.FLIP_LEFT_RIGHT,表示将图像左右翻转
Image.FLIP_TOP_BOTTOM,表示将图像上下翻转
Image.ROTATE_90,表示将图像逆时针旋转90°
Image.ROTATE_180,表示将图像逆时针旋转180°
Image.ROTATE_270,表示将图像逆时针旋转270°
Image.TRANSPOSE,表示将图像进行转置(相当于顺时针旋转90°)
Image.TRANSVERSE,表示将图像进行转置,再水平翻转
下面我们来看下效果: - thumbnail((尺寸),采样算法) 创建缩略图(注意:尺寸传参的是元组)
这张照片的差别感觉不大,但是NEAREST采样方式是最差的,默认使用的是BICUBIC,我们一般使用LANCZOS作为我们的采样算法,对于其中的差别,还是要多试,找到自己需求的那一个就好; - resize((尺寸),采样算法) 调整图片分辨率
这个方法跟thumbnail()的用法和功能还是非常相近,区别是:thumbnail()分辨率不能大于原分辨率,如果大于了也不会报错,最按照原分辨率设置,resize()则没有这个限制; - rotate(角度) 逆时针旋转图像到指定角度