文章目录1.1 、打开图片和显示图片
1.2、创建一个简单的图像
1.4、图像旋转和格式转换
三、ImageChops模块(图像合成)
四、ImageEnhance模块(色彩、亮度)
Pillow模块讲解
一、Image模块
1.1 、打开图片和显示图片
对图片的处理最基础的操作就是打开这张图片,我们可以使用Image模块中的 open(fp, mode)方法 ,来打开图片。open方法接收两个参数,第一个是文件路径,第二个是模式。主要的模式如下:
mode(模式)bands(通道)说明“1”1数字1,表示黑白二值图片,每个像素用0或1共1位二进制码表示“L”1灰度图“P”1索引图“RGB”324位真彩图“RGBA”4“RGB”+透明通道“CMYK”4印刷模式图像
更多的模式也就不说了,关于模式的模式的详细介绍我也不知道。这个open方法返回一个Image对象,mode也不是必须参数。打开图片代码如下:
from PIL import Image
# 打开图片
im = Image.open('test.jpg')
# 显示图片
im.show()
当然显示图片不是我们的重点,我们获取Image对象之后,就可以获取它的一些信息了。
print('图像的格式:', im.format)
print('图像的大小:', im.size)
print('图像的宽度:', im.width)
print('图像的高度:', im.height)
# 传入坐标的元组
print('获取某个像素点的颜色值:', im.getpixel(100, 100))
在我的环境中运行结果如下:
图像的格式: JPEG
图像的大小: (3968, 2976)
图像的宽度: 3968
图像的高度: 2976
获取某个像素点的颜色值: (198, 180, 132)
1.2、创建一个简单的图像
在Image模块中,提供了创建图像的方法。主要是通过**Image.new(mode, size, color)**实现,该方法传入三个参数:mode:图像的创建模式
size:图像的大小
color:图像的颜色
用该方法可以创建一个简单的图像,之后我们可以通过save方法将图像保存:
from PIL import Image
# 创建一个简单的图像
im = Image.new('RGB', (100, 100), 'red')
# 保存这个图像
im.save('red.png')
生成图片如下:
1.3、图像混合
(1)透明度混合
透明度混合主要是使用**Image中的blend(im1, im2, alpha)**方法,对该方法的解释如下:im1:Image对象,在混合的过程中,透明度设置为(1-apha)
im2:Image对象,在混合的过程中,透明度设置为(apha)
alpha:透明度,取值是0-1。当透明度为0是,显示im1对象;当透明度为1时,显示im2对象
注意:im1和im2的大小必须一样,且mode都为RGB
代码实现如下:
from PIL import Image
# 打开im1
im1 = Image.open('pic.jpg').convert(mode='RGB')
# 创建一个和im1大小一样的图像
im2 = Image.new('RGB', im1.size, 'red')
# 混合图片,并显示
Image.blend(im1, im2, 0.5).show()
下面为原图和混合图的对比:
不得不说,我家艾斯真滴帅。
(2)遮罩混合
接下来就是很迷的时刻了,我们可以通过 Image.composite(im1, im2, mask) 方法实现遮罩混合。三个参数都是Image对象,该方法的作用就是 使用mask来混合im1和im2 。我是听不懂,你们能听懂最好给我讲一下。具体实现如下:
# 这句代码写了好多遍,我真不想写了
from PIL import Image
# 打开图像1
im1 = Image.open('pic1.jpg')
# 打开图像2
im2 = Image.open('pic2.jpg')
# 重新设置im2的大小
im2.resize(im1.size)
# 将图像2的三个色道分离,其中r、g、b都为Image对象
r, g, b = im2.split()
# 遮罩混合
Image.composite(im1, im2, b).show()
注意:im1、im2和mask的大小必须一样
im1、im2和遮罩混合效果对比如下:
依旧是我帅气的艾斯。
1.4、图像缩放
(1)按像素缩放
按像素缩放通过 Image.eval(im1, fun)方法 实现,其中im1为我们老生常谈的Image对象了;第二个为一个方法(函数),该函数传入一个参数,即像素点。该函数会对图片中每个像素点进行函数内的操作。下面我们对来简单使用一下这个方法:
from PIL import Image
# 打开一张图像
im = Image.open('抠鼻屎.jpg')
# 对该图像每个像素点进行*2处理
Image.eval(im, lambda x:x*2).show()
这里我使用的lambda表达式,当然一般也都是用lambda表达式,不过你也可以像下面这样写: