众所周知,图像处理是所有计算机编程语言中不可或缺的一部分。Python作为一种科学编程语言,为图像处理提供了丰富的工具。
1、PIL库介绍
PIL(Pillow)是一个强大的Python图像处理库,类似于 PS(Photoshop) 编辑图片,PIL库提供了通用的图像处理功能,以及大量有用的基本图像操作,比如画图操作、图像缩放、裁剪、旋转、颜色通道转换、图像格式转换等。利用PIL中的函数,为图像处理方面提供了简单方便的方法。PIL模块的主要功能包括:
-
支持图像的展示、操作和保存,PIL库几乎能够处理任何格式的图像,比如 "jpeg","png","bmp","gif","ppm","tiff" 等。
-
支持图像的绘制,可以在图像上绘制各种形状、文本等。
-
支持图像的处理,提供颜色值转换、图像滤镜、图像变换(缩放、旋转)、图像裁剪等功能。
-
支持图像分析,提供绘制图像的直方图方法、像素统计等分析功能。
2、PIL库安装
PIL是第三方库,使用之前需要先安装。可以通过pip进行安装:
pip install Pillow
执行以上安装命令,如果运行结果出现“Successfully installed”,说明已经安装成功;如果运行结果出现“Requirement already satisfied”,说明该模块已经被安装过,不用再安装。
3、PIL常用的方法介绍
读取图像方法:使用Image.open()方法可以轻松地读取图像文件。例如,img=Image.open('test.jpg')可以打开名为test.jpg的图像文件,并将其存储在一个Image对象中。
保存图像方法:save(filename, format)方法可以将编辑后的图像保存到电脑上。其中filename为文件名,format是图片格式,如果调用时不指定第二个参数的图片格式,将自动根据文件名filename原有的格式存储图像;如果指定格式,则按照格式存储。例如,img.save('test.jpg')可以将编辑后的图像保存为test.jpg。
调整图像大小方法:使用resize()方法可以调整图像的大小。例如,new_img=img.resize((500, 200))可以将图像调整为500x200像素的大小。
旋转图像方法:使用rotate()方法可以旋转图像,rotate()方法接受一个角度作为参数,以逆时针方向旋转图像。例如,rotated_img=img.rotate(90)可以将图像以逆时针方向旋转90度。
裁剪图像方法:使用crop()方法可以从图像中裁剪出一个特定区域。例如,cropped_img=img.crop((100, 100, 200, 200))可以从图像中裁剪出一个矩形区域,该区域的左上角的坐标为(100, 100),右下角的坐标为(200, 200),根据左上角和右下角两个相对的坐标形成一个矩形。如下图所示:
调整图像亮度方法:使用point()方法可以对图像的每个像素通过指定的函数进行亮度处理,以改变其亮度。例如,brighter_img=img.point(lambda p: p * 1.5)可以通过lambda匿名函数增加图像的亮度。
创建新的Image对象:使用Image.new(mode, size, color)方法可以创建一个新的Image对象,其中mode参数是图片的模式,包括“1”、“L”、“P”“RGB”、“RGBA”等,当设置图片的mode为“RGBA”时,如果不填color参数的话,图片是透明底。其中size参数含有图片宽,高的元组(width, height)。其中color参数是图片的颜色,其默认值为0,即黑色。
例如,new_img=Image.new(mode='RGBA', (200, 100), "#000000")可以创建一个200×100大小黑色图像。
4、PIL库给图片添加文字水印的简单实例
动手练一练:
from PIL import Image, ImageDraw, ImageFont
import os
# 创建一个200×100大小的红色图像
image = Image.new("RGBA", (200, 100), "#ff0000")
# 或者直接加载本地图片
# new_img = "D:\\my_image.jpg" # 将此处替换为你的图片路径
# image = Image.open(new_img)
# 设置字体
font_path = "simhei.ttf" # 字体为黑体
font_size = 30 # 字体大小
font = ImageFont.truetype(font_path, font_size)
# 创建一个可以在图像上绘制的对象
draw = ImageDraw.Draw(image)
# 水印文本内容
watermark_text = "这是文字水印"
# 水印位置
text_position = (10, 10)
# draw对象上添加水印,字体水印为半透明白色
draw.text(text_position, watermark_text, font=font, fill=(255, 255, 255, 128))
# 保存图片到D盘,图片名为watermarked_image.png
output_path = "D:\\watermarked_image.png"
image.save(output_path)
# windows下打开文件
os.startfile(output_path)
print("水印添加完成,保存路径:", output_path)
运行以上代码后,会在电脑的D盘创建一张名为watermarked_image.png的水印图片。水印图片生成过程解析如下:
-
Image.new()方法用于创建一个新的Image对象
-
Image.open()方法用于打开指定路径的图片。
-
ImageFont.truetype()方法用于加载指定的字体和大小。
-
ImageDraw.Draw()方法创建一个绘图对象,使我们可以在其上面绘制图形或文字。
-
draw.text()方法用于在指定位置绘制文本,其中fill参数设置字体颜色和透明度。
-
image.save()方法用于保存处理后的图像。
注意,使用new("RGBA", (200, 100), "#ff0000")创建图像对象时,参数设置为“RGBA”,表示含有透明度通道的图片,再通过image.save()方法保存图像时,图像命名必须是“.png”后缀名,不能保存为“.jpg”后缀名。上面的例子中,如果保存图片的名称为“watermarked_image.jpg”,将会提示错误“OSError: cannot write mode RGBA as JPEG”。因为“RGBA”格式的图片不支持直接保存为JPEG格式,所有的JPEG格式没有透明背景(无Alpha通道),JPEG格式背景通常会显示为白色,而“RGBA”格式包含透明度信息。
5、PIL库支持的图像模式
除了上面介绍的“RGBA”模式,PIL库共支持9种图像模式:
1:黑白图像,也称为“二值图像”,属于单色通道,非黑即白,0表示黑,1表示白。
L:灰度图像,每个像素用8个bit表示,取值范围为0~255,表示从纯黑到纯白,0表示黑,255表示白,其他数字表示不同的灰度。
P:8位彩色图像,每个像素用8个bit表示,其对应的彩色值是按照调色板查询出来的。
RGB:一种32位的彩色图像模式,每个像素由红 (R)、绿(G)、蓝(B)三个颜色通道组成,每个通道的取值范围为0到255,共256个级别。例如,红色可以通过RGB值(255, 0, 0)来表示,绿色可以通过RGB值(0, 255, 0)来表示,蓝色可以通过RGB值(0, 0, 255)来表示,蓝绿色可以通过RGB值(0, 255, 128)来表示。RGB模式能够表示1677万种颜色,足以覆盖大多数自然色彩。RGB模式不包括透明度信息,但可以通过RGBA模式来处理带有透明度的图像。
RGBA:一种32位的彩色图像模式,每个像素由红 (R)、绿(G)、蓝(B)、alpha通道(A)共四个颜色通道组成,其中alpha通道表示透明度通道。RGBA模式通常用于需要透明背景的图像处理,如PNG格式的图片。例如,红色可以通过RGBA值(255, 0, 0, 255)来表示,其中第一个整数红色(R)的最大值为255,第二个整数绿色(G)和第三个整数蓝色(B)的值均为0,第四个整数透明度(A)为255表示完全不透明。
CMYK:一种32位的彩色图像模式,每个像素使用青色(Cyan)、品红(Magenta)、黄色(Yellow)和黑色(Black)四种颜色进行混合,CMYK模式的颜色混合原理,可以理解为利用青色、品红色和黄色三种颜料,再加上黑色油墨,共计四种颜色混合叠加,形成全彩印刷效果。例如,红色可以通过RGBA值(C=0,M=100,Y=100,K=0)来表示,其中青色(C)值为0,洋红色(M)值为100,黄色(Y)值为100,黑色(K)值为0。
YCbCr:一种24位的彩色图像模式,其中“Y”表示亮度分量,“Cb”和“Cr”分别表示蓝色和红色色度分量。YCbCr是一种常用的色彩空间,常用于视频压缩和数字摄影系统中。
I:一种32位的整型灰色图像,0表示黑,255表示白,其他数字表示不同的灰度。与L模式相同,都用于表示图像的亮度信息。在PIL中,I模式的图像与L模式在存储和处理上没有区别,它们都仅存储图像的亮度信息,不包含颜色信息。每个像素的值表示其灰度级别,通常在0(黑色)到255(白色)之间。
F:一种32位的浮点灰色图像,0表示黑,255表示白,0~255之间的数字表示不同的灰度。
6、利用PIL库在图像上绘制图形。
在Python中,使用PIL(Pillow)绘制图形是一个常见的任务,包括在图像上绘制矩形、圆形和直线等。PIL库可以通过rectangle()函数和ellipse()函数分别在图像上绘制指定大小和颜色的矩形和圆形,还可以通过line()绘制一条直线。例如:
动手练一练:
from PIL import Image, ImageDraw
import os
# 创建一张400×400大小的黄色背景图像
image = Image.new("RGBA", (400, 400),"#f0f34c")
# 创建一个可以在图像上绘制的对象
draw = ImageDraw.Draw(image)
# 绘制一个矩形,左上角坐标为(100, 100),右下角坐标为(200, 200)
# 填充整个矩形为红色,边框为黑色,边框的宽度为2
draw.rectangle([(100, 100), (200, 200)], fill="#ff0000", outline="#000000", width=2)
# 绘制一个圆形,左上角坐标为(200, 200),右下角坐标为(300, 300)
# 填充整个圆形为绿色,边框为黑色,边框的宽度为2
draw.ellipse((200, 200, 300, 300), fill="#6ce26c", outline="#000000", width=2)
# 绘制一条紫色直线,以(300, 300)为起点,(400, 300)为终点,直线的宽度为4
draw.line((300, 300, 400, 300),fill="#e400ff", width=4)
# 保存图片到D盘,名为watermarked_image.png
output_path = "D:\\watermarked_image.png"
image.save(output_path)
# windows下打开文件
os.startfile(output_path)
print("水印添加完成,保存路径:", output_path)
执行以上代码,生成的图片如下所示: