Python Pillow(PIL)库的用法详解
作者:Python碎片 发布时间:2022-01-31 13:43:26
Pillow库是一个Python的第三方库。
在Python2中,PIL(Python Imaging Library)是一个非常好用的图像处理库,但PIL不支持Python3,所以有人(Alex Clark和Contributors)提供了Pillow,可以在Python3中使用。
官方文档路径:https://pillow.readthedocs.io/en/latest/
一、安装Pillow
pip install pillow
Pillow库安装成功后,导包时要用PIL来导入,而不能用pillow或Pillow。
import PIL
from PIL import Image
在Pillow库中,有二十多个模块,还支持非常多的插件。其中最常用的是Image模块中同名的Image类,其他很多模块都是在Image模块的基础上对图像做进一步的特殊处理。本文主要介绍Image模块的常用用法,其他的模块可以按需看文档。
二、打开本地图片
# coding=utf-8
from PIL import Image
image = Image.open("yazi.jpg")
image.show()
运行结果:
open(fp, mode='r'): 打开一张图片,如果图片与当前代码在同一目录下,可以只写图片的文件名,其他情况需要拼接图片的路径。mode默认为'r',也必须为'r'。
show(): 调用图片显示软件打开图片。打开后程序会阻塞,需要手动关闭。
三、创建一张新图片
from PIL import Image
image = Image.new('RGB', (160, 90), (0, 0, 255))
image.show()
运行结果:
new(mode, size, color=0): 创建一张图片(画布),用于绘图,有3个参数。
mode, 图片的模式,如“RGB”(red,green,blue三原色的缩写,表示真彩 * 像)、“L”(灰度,黑白图像)等。
size, 图片的大小。是一个长度为2的元组(width, height),表示的是像素大小。
color, 图片的颜色,默认值为0表示黑色。可以传入长度为3的元组表示颜色,也可以传入颜色的十六进制,在版本1.1.4后,还可以直接传入颜色的英文单词,如上面代码中的(0, 0, 255)可以换成‘#0000FF'或‘blue',都是表示蓝色。
四、Image模块的常用属性
from PIL import Image
image = Image.open("yazi.jpg")
print('width: ', image.width)
print('height: ', image.height)
print('size: ', image.size)
print('mode: ', image.mode)
print('format: ', image.format)
print('category: ', image.category)
print('readonly: ', image.readonly)
print('info: ', image.info)
运行结果:
width: 1557
height: 911
size: (1557, 911)
mode: RGBA
format: jpg
category: 0
readonly: 1
width属性表示图片的像素宽度,height属性表示图片的像素高度,width和height组成了size属性,size是一个元组。
mode属性表示图片的模式,如RGBA,RGB,P,L等。
format属性表示图片的格式,格式一般与图片的后缀扩展名相关。category属性表示图片的的类别。
readonly属性表述图片是否为只读,值为1或0,表示的是布尔值。
info属性表示图片的信息,是一个字典。
五、图片的模式和模式转换
1. 图片的模式
图片有很多模式,支持以下标准模式,参考:https://pillow.readthedocs.io/en/latest/handbook/concepts.html#concept-modes
mode | 描述 |
1 | 1位像素,黑白,每字节存储一个像素 |
L | 8位像素,黑白 |
P | 8位像素,使用调色板映射到任何其他模式 |
RGB | 3x8位像素,真彩色 |
RGBA | 4x8位像素,带透明蒙版的真彩色 |
CMYK | 4x8位像素,分色 |
YCbCr | 3x8位像素,彩 * 格式 |
LAB | 3x8位像素,L * a * b颜色空间 |
HSV | 3x8位像素,色相,饱和度,值颜色空间 |
I | 32位有符号整数像素 |
F | 32位浮点像素 |
1位像素的范围是0-1,0表示黑1表示白,中间表示灰。8位像素的范围是0-255,如RGB的(0, 0, 0)表示黑,(255, 255, 255)表示白,依此类推。
2. 图片的模式转换
from PIL import Image
image = Image.open("yazi.jpg")
print(image.mode)
image1 = image.convert('1')
print(image1.mode)
# image1.show()
image_l = image.convert('L')
print(image_l.mode)
# image_l.show()
image_p = image.convert('P')
print(image_p.mode)
image_p.show()
运行结果:
RGBA
1
L
convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 将当前图片转换为指定的模式,并且返回转换后的图片。如果不指定模式,则选择一种能保留图片所有信息且不使用调色板的模式(通常的结果是不转换)。将彩 * 像转换为灰度('L')时,使用ITU-R 601-2进行亮度转换:L = R * 299/1000 + G * 587/1000 + B * 114/1000 。将灰度('L')或真彩('RGB')转换为模式'1'时,如果dither参数为'NONE',所有大于128的值均设置为255(白色),所有其他值都设为0(黑色)。
convert()方法有5个参数,都有默认值,根据转换的模式来传值:
mode,图片的模式,传入需要转换的模式。部分模式之间不支持转换,代码会报错。
matrix, 转换矩阵。传入该参数时,应该传入由浮点数构成的元组,元组长度为4或12。matrix只支持从少数模式转换成'L'或'RGB'。
dither, 高频振动,用于控制颜色抖动。从模式'RGB'转换为'P'或从'RGB'或'L'转换为'1'时使用。可用的方法有'NONE'或'FLOYDSTEINBERG'(默认)。当提供了matrix参数时不使用此功能。
palette, 调色板,用于控制调色板的产生。从模式'RGB'转换为'P'时使用,可用的方法有'WEB'(默认)或'ADAPTIVE'。'ADAPTIVE'表示使用自适应的调色板。
colors, 自适应调色板使用的颜色数。当palette参数为'ADAPTIVE'时,用于控制调色板的颜色数目。默认是最大值,即256种颜色。
2.1 matrix参数的效果对比
from PIL import Image
image = Image.open("yazi.jpg")
image_rgb = image.convert('RGB')
print(image_rgb.mode)
image_l = image_rgb.convert('L')
image_l.show()
matrix = (0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6)
image_l2 = image_rgb.convert('L', matrix=matrix)
image_l2.show()
运行结果:
上面的代码中,给matrix参数传入了一个长度为12的元组,matrix的值改变了转换的效果,变化程度取决于传入的元组中浮点数的值。注意,有些模式是不支持的,如'RGBA',且传入的元组长度必须为4或12,否则报错。
2.2 palette参数的效果对比
from PIL import Image
image = Image.open("yazi.jpg")
image_p = image.convert('P')
# image_l.show()
image_p2 = image.convert('P', palette='ADAPTIVE', colors=256)
image_p2.show()
运行结果:
上面的代码中,将palette参数改为了'ADAPTIVE',图片的差异不大,不过,如果将colors变小差异会比较大,但那样会将图片效果变差。
六、图片拷贝粘贴和保存
from PIL import Image
image = Image.open("yazi.jpg")
image_copy = image.copy()
# image_copy.show()
image_new = Image.new('RGB', (160, 90), (0, 0, 255))
image_new2 = Image.new('L', (160, 90), '#646464')
image_copy.paste(image_new, (100, 100, 260, 190), mask=image_new2)
image_copy.save('duck.jpg')
image_save = Image.open('duck.jpg')
print(image_save.format, image_save.mode)
image_copy.show()
运行结果:
jpg RGBA
copy(): 拷贝当前的图片,拷贝出来的图片与原图一模一样。如果想在图片上粘贴一些内容,又想保留原图时,可以使用此方法。
paste(im, box=None, mask=None): 将另一张图片粘贴到当前图片中,如果粘贴的模式不匹配,则将被粘贴图片的模式转换成当前图片的模式。有3个参数。
im, 被粘贴的图片。传入一张图片,当第二个参数box指定的是一个区域时,im参数也可以是一个整数或颜色值(元组表示,16进制表示和颜色名都可以,如上面代码中的image_new可以换成(0, 0, 255), '#0000FF', 'blue')。
box, 图片粘贴的位置或区域。传入一个长度为2或4的元组,如果不传值,默认为(0, 0),图片被粘贴在当前图片的左上角。如果传入长度为2的元组(x, y),表示被粘贴图片的左上角坐标位置。如果传入长度为4的元组(x1, y1, x2, y2),表示图片粘贴的区域,此时区域的大小必须与被粘贴图片一致,否则会报错,传入的元组长度为其他值也会报错。
mask, 蒙版。传入一张与被粘贴图片尺寸一样的图片,可以使用模式为'1'、'L'或者'RGBA'的图像。如果mask图像的颜色值为255,则直接按被粘贴图片的颜色粘贴,如果mask图像的颜色值为0,则保留当前图片的颜色(相当于没有粘贴),如果mask图像的颜色值为0~255之间的值,则将im与mask进行混合后再粘贴。
save(fp, format=None, **params): 将当前图片按指定的文件名保存,运行后会将图片按新名字保存在当前路径下(也可以指定路径)。文件名最好带扩展名,方便打开,format表示图片的格式,没有指定format则会根据扩展名来解析(如果能解析出来),一般不需要指定format,传入一个规范的文件名即可。
七、图片的裁剪和缩放
from PIL import Image
image = Image.open("yazi.jpg")
image_crop = image.crop(box=(300, 300, 800, 700))
# image_crop.show()
print('before resize: ', image.size)
image_resize = image.resize((500, 400), resample=Image.LANCZOS, box=(100, 100, 1200, 800), reducing_gap=5.0)
print('after resize: ', image_resize.size)
image_resize.show()
运行结果:
before resize: (1557, 911)
crop(box=None): 裁剪图片,返回裁剪区域的图片。box表示裁剪的区域,传入长度为4的元组(x1, y1, x2, y2),不传默认为拷贝原图,相当于copy()方法,如果裁剪的区域超过了原图的区域,超出部分用像素格填充。
resize(size, resample=BICUBIC, box=None, reducing_gap=None): 缩放图片,返回缩放后的图片。有4个参数。
size, 图片缩放后的尺寸,传入一个长度为2的元组(width, height)。
resample, 重采样,是一个可选的重采样过滤器。可以传入Image.NEAREST, Image.BOX, Image.BILINEAR, Image.HAMMING, Image.BICUBIC, Image.LANCZOS。默认过滤器为Image.BICUBIC。如果图像的模式为'1'或'P',则始终设置为Image.NEAREST。
box, 缩放图片的区域。传入长度为4的元组(x1, y1, x2, y2),这个区域必须在原图的(0, 0, width, height)范围内,如果超出范围会报错,如果不传值则默认将整张原图进行缩放。
reducing_gap, 减少间隙。传入一个浮点数,用于优化图片缩放效果,默认不进行优化,值大于3.0时优化效果基本已经是公平的重采样。
来源:https://blog.csdn.net/weixin_43790276/article/details/108478270
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 爬虫数据保存到mongoDB的方法:import pymongo# 首先需要注意,mongodb数据库存储的类型是以键值
- 这个javascript农历日历,万年历代码网上看到的,很不错,功能齐全,值得收藏!功能介绍:动态显示当前世界各国各时区时间,显示当前农历,
- 照片尺寸 单位:cm1X1.5 (1寸) 2.6*3.9 一寸2.5*3.5 1.5X2 (2寸) 3.8*
- 本文实例讲述了PHP实现的AES加密、解密封装类与用法。分享给大家供大家参考,具体如下:<?php/** * Class AES *
- 加强ASP网站后台安全一些主要措施:----------------------------------------------------
- 想学习Python3,但是暂时又离不开Python2。在Windows上如何让它们共存呢?目前国内网站经常会让大家把其中一个python.e
- 最近一个小项目需要一个星级评分的效果,所以去淘宝偷了一个,但是还得加载YUI很不爽,还是自己动手写一个吧~HTML: <!-
- 下面这个函数使用FSO对象来判断服务器上的某个文件是否存在:<%Private Function Dir(byVa
- python中.split()只能用指定一个分隔符例如:text='3.14:15'print text.split(
- 新闻系统、blog系统等都可能用到将动态页面生成静态页面的技巧来提高页面的访问速度,从而减轻服务器的压力,本文为大家搜集整理了ASP编程中常
- 本文实例讲述了RSA实现JS前端加密与PHP后端解密功能。分享给大家供大家参考,具体如下:web前端,用户注册与登录,不能直接以明文形式提交
- 阅读:Dreamweaver量身打造Wordpress留言板(一)虽然说在Dreamweaver量身打造Wordpress留言板(二)这一篇
- Altova 公司的 XMLSPY 是个不可多得的好东西,它几乎可以开发所有的 XML 产品。最近用它来做 Schema
- 前言Github源码地址本文同时也是学习唐宇迪老师深度学习课程的一些理解与记录。文中代码是实现在TensorFlow下使用卷积神经网络(CN
- “网页设计三剑客”可能很多新同学都没听说过,因为缔造神话的公司已经快销声匿迹。“网页设计三剑客”是Macromedia公司旗下Dreamwe
- 利用python+ffmpeg合并B站视频及格式转换 B站客户端下载的视频一般有两种格式:早期的多为blv格式(由flv格式转换而来,音视频
- Python需要使用标识符给变量命名,其实标识符就是用于给程序中变量、类、方法命名的符号(简单来说,标识符就是合法的名称标识符需要以字母或下
- 相信很多人在使用正则表达式的时候都会遇到如下的语句:通过查阅正则表达式的API文档可以了解到正则表达式的语法知识:很多小伙伴就会产生疑问为什
- 本文实例讲述了Python zip()函数用法。分享给大家供大家参考,具体如下:这里介绍python中zip()函数的使用:>>
- 导语每日游戏更新系列——今天带大家来看看扫雷小游戏!它是许多人接触到的第一款游戏,大概也是广大办公族和无网学生无聊时消遣的最佳游戏。在那些还