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')
 def pic_filter(imfile, x):
     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,    # 进一步平滑
     ]
 return imfile.filter(filters[x]) # 根据列表序号选择效果并显示
 pic_filter(pic,3).show()

图片分享

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Jo_Francis/article/details/125140121
今日推荐