Pillow 图片处理模块
Pillow是Python第三方库,Python2中有一个叫PIL(Python Imaging Library)的标准库,但不支持Python3,所以一些志愿者在PIL的基础上创建了Pillow,支持Python3。Pillow支持动态图像编辑。
-
安装Pillow
pip install pillow
Pillow安装成功后,需要用PIL导入:
import PIL
from PIL import Image
Image是最常用的模块。
-
打开或者新建一张图片
import PIL from PIL import Image pic = Image.open(\'11.jpg\') pic.show() im = Image.new(\'RGB\', (480, 640), (\'pink\')) im.show()
Image.new()方法有三个参数:图像模式(RGB),图像尺寸(宽,高),颜色(red,green,blue),颜色可以直接用#0000FF或者blue表示蓝色。
Image.show()方法可以调用系统自带的图像查看程序显示当前图片,如系统中并未安装相应程序,有执行程序时将无任何显示。
-
Image模块的常用属性
print(\'宽:\', pic.width) # 宽: 1361 print(\'高:\', pic.height) # 高: 1814 print(\'尺寸:\', pic.size) # 尺寸: (1361, 1814) print(\'色彩模式:\', pic.mode) # 色彩模式: RGB print(\'图像格式:\', pic.format) # 图像格式: JPEG # print(\'图片类别:\', pic.category) print(\'只读:\', pic.readonly) # 只读: 1 print(\'图片信息:\', pic.info) # 图片信息: {\'jfif\': 257, \'jfif_version\': (1, 1), \'jfif_unit\': 0, \'jfif_density\': (1, 1)}
其中size属性返回的是一个元组。
-
Image.convert()方法进行图像模式(mode)转换,支持以下标准模式:
convert(self, mode=None, matrix=None, dither=None, palette=WEB, colors=256): 将当前图片转换为指定的模式,并且返回转换后的图片。
如果不指定模式,则选择一种能保留图片所有信息且不使用调色板的模式(通常的结果是不转换)。
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)表示白,依此类推。
pic1 = pic.convert(\'1\') pic1.show()
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种颜色。
-
图片的复制、粘贴和保存
pic = Image.open(\'11.jpg\') im = Image.new(\'RGB\', (128, 128), (255, 0, 0)) im1 = Image.new(\'RGBA\', (128, 128), (0, 0, 255)) pic1 = pic.copy() pic1.paste(im, (640, 600), mask=im1) pic1.save(\'22.jpg\', quality=95, subsampling=0)
Image.copy()方法:将指定对象复制并返回。
Image.paste(im,(行,列),mask=None):在当前图片对象基础上,把im对象粘贴到指定位置,mask参数指定蒙板。
Image.save()方法:保存当前图片对象到指定位置。
具体说明:
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, quality=95, subsampling=0): 将当前图片按指定的文件名保存,运行后会将图片按新名字保存在当前路径下(也可以指定路径)。文件名最好带扩展名,方便打开,format表示图片的格式,没有指定format则会根据扩展名来解析(如果能解析出来),一般不需要指定format,传入一个规范的文件名即可。quality:压缩比,默认是75。subsampling:可选参数为0,1,2;选择0即可实现小变大的需求。
-
图片裁剪和缩放
pic = Image.open(\'11.jpg\') im_crop = pic.crop(box=(200, 200, 680, 840)) im_crop.show() im_resize = pic.resize((480, 640),reducing_gap=2) im_resize.show()
im_crop = pic.crop(box=(200, 200, 680, 840)):裁剪图片,box参数中的四个数字为图片坐标,分别是x1,y1,x2,y2。
im_resize = pic.resize((480, 640),reducing_gap=2):
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时优化效果基本已经是公平的重采样。
-
图片旋转和翻转
- rotate()方法:将图片对象进行旋转,可以实现顺时针或逆时针任意角度。
- transpose()方法:将图片对象进行顺时针或逆时针90度旋转或者翻转,区别于上面的方法不能任意角度,但可以进行垂直或水平翻转。 ★★★★★这个方法比较常用,但根据系统提示在Pillow10(2023-07-01)更新后会停用现在的方法。
im_resize.rotate(45).show() # 图片向左(逆时针)旋转45度并显示。 im_resize.transpose(Image.FLIP_LEFT_RIGHT).show() # 逆时针旋转90度并显示。 im_resize.transpose(Image.FLIP_TOP_BOTTOM).show() # 逆时针旋转90度并显示。 im_resize.transpose(Image.ROTATE_90).show() # 逆时针旋转90度并显示。 im_resize.transpose(Image.ROTATE_180).show() # 逆时针旋转90度并显示。 im_resize.transpose(Image.ROTATE_270).show() # 逆时针旋转90度并显示。
-
图片特效
Pillow提供一些简单的图片特效使用,需要从PIL库中导入ImageFilter模块。
pic = Image.open(\'11.jpg\') filters = [ ImageFilter.BLUR, # 模糊效果 ImageFilter.DETAIL, # 细节效果 ImageFilter.CONTOUR, # 轮廓效果 ImageFilter.EDGE_ENHANCE, # 边缘增强(比锐化更好) ImageFilter.EDGE_ENHANCE_MORE, # 进一步边缘增强 ImageFilter.FIND_EDGES, # 查找边缘 ImageFilter.EMBOSS, # 浮雕效果 ImageFilter.SHARPEN, # 锐化 ImageFilter.SMOOTH, # 平滑 ImageFilter.SMOOTH_MORE, # 进一步平滑 ] pic.filter(filters[6]).show() # 根据列表序号选择效果并显示
来源:https://www.cnblogs.com/amwkvi/p/16166126.html
本站部分图文来源于网络,如有侵权请联系删除。