1 . 前言
PIL 是 Python Image Library 的简称。
PIL 库中提供了诸多用来解决图片的模块,能够对图片做相似于 PS(Photoshop) 的编辑。比方:扭转图像大小、旋转图像、图像格式转换,转换色彩通道,图像增强,直方图解决,插值和滤波等等。
PIL 是第三方库,应用之前须要先装置。
pip install pillow
2. 色彩模式
持续之前先解一个重要概念:色彩模式。
所谓色彩模式:指在计算机中如何模拟出事实世界中的各种色彩,或精确讲是一种色彩生成算法。
罕用的色彩模式:
RGB: 基础理论就是对图片中的每一个像素点,按红 (Red)、绿(Green)、蓝(Blue)三色系的不同重量组合出事实世界中的色彩。也能够说,咱们在计算机上中所看到的 RGB 图片的色彩是由三色系重量组合而成。或称其有 3 个色彩通道。
Tip: 咱们在电脑中所看到的图片大多数都是像素图片,像素图片的特点就是整张图片由很多的像素点组成,每一个像素点有本人的色彩。
在 RGB 色彩模式中,计算机为红色、绿色、蓝色别离调配 8 bit 的空间,也意味着红色、绿色、蓝色各自的重量变动是在 0~255(8bit 二进制换算成十进制度的最大值)之间。
所以计算机应用 RGB 色彩模式最多能够模拟出 255X255X255 种颜色,这应该足够多了,曾经能够让计算机显示出多彩斑斓的事实世界。
Tip: RGBA 是 RGB 色彩模式的减少版。除了能够模仿色彩,还能够摸拟透明度。A 是 Alpha 的缩写,这是能够了解为透过或透明度的意思。
- CMYK: C:Cyan = 青色,又称为‘天蓝色’或是‘蔚蓝’;M:Magenta = 品红色,又称为‘洋红色’;Y:Yellow = 黄色;K:blacK=彩色。CMYK 往往用于模仿印刷制品色彩。多用于广告设计。
能够应用 PIL 库的 ImageColor 模块的 getColor( ) 办法获取一个色彩的不同色彩重量值。
from PIL import ImageColorred = ImageColor.getrgb("red")print(red)'''输入后果(255, 0, 0)'''
Tip: ImageColor 模块外部保护有一个字典。
getColor( ) 办法用使用者提供的色彩名字为键,在字典中查找到对应色彩,再转换成元组后返回。
colormap = {"aliceblue": "#f0f8ff","antiquewhite": "#faebd7","aqua": "#00ffff","aquamarine": "#7fffd4","azure": "#f0ffff","beige": "#f5f5dc","bisque": "#ffe4c4","black": "#000000","blanchedalmond": "#ffebcd",……}
3. 解决图片
解决图片,次要是应用 PIL 库的 Image 模块(也是外围模块)。在解决图片之前请提前准备 3 张图片(2 张 jpg 格局的图片,1 张 png 格局的图片)。
Tip: 为了不便操作,把图片寄存到我的项目目录中,加载图片时应用相对路径形容。
这是一张名为 back_,jpg 的图片
这是一张名为 dog.jpg 的图片
这是一张名为 guo_ke.png 的图片
3.1 基本操作
关上图片: 解决图片之前,先要关上图片,能够应用 Image 模块中的 open( ) 办法 关上。此办法返回一个 PIL.Image.Image 类型的对象。
Tip: 本文不刻意辨别函数和办法的概念,对立称为办法。
# 原型def open(fp, mode="r", formats=None): ……
open( ) 办法特点: open( ) 办法不会立刻加载图片数据,只有在解决图片或调用图片的 load( ) 办法时才会加载。
from PIL import Image# open( ) 办法具备懒(提早)加载的个性img = Image.open("back_.jpg")#立刻加载图片数据img.load()
open( ) 办法参数阐明:
- fp: 设置要关上的图片文件。能够是字符串形容的文件名称、也能够是一个文件对象。
from PIL import Image# mode 必须是 "rb"file = open("dog.png", mode="rb")#文件对象作为参数img = Image.open(file)
- mode: 对图片文件操作的模式,默认是 “r” 。如果设置,也只能是 "r"。
- formats: 列表或元组类型,指定文件的关上格局,默认由办法本人判断。
- 图片的惯例属性: 图片对象有几个罕用的属性。
- mode: 图片的色彩模式(RGB,CMYK,RGBA,L……)。不同色彩模式的图片其通道数量会有差别。
- format: 图片的格局(PNG,JPEG,GIF……)。JPEG格局的图片没有 A 通道,所以 JPEG 图片是没有透明度信息的。PNG 图片有 A 通道,具备透明性。GIF 图片格式有帧的概念,一张 GIF 图片其实是由多张图片组成的,每一张图片为一帧。
- size: 图片大小。在解决图片时,图片大小用 2 元组示意。
from PIL import Imageimg = Image.open("dog.jpg", mode="r")print("图片色彩模式:", img.mode)print("图片的格局:", img.format)print("图片的大小:", img.size)'''输入后果图片色彩模式: RGB图片的格局: JPEG图片的大小: (852, 639)'''
- 批改图片的属性
PIL.Image.Image 对象提供有办法用来批改图片的的属性,如扭转大小、扭转模式、扭转格局。
批改图片的大小: 可应用图片对象的 resize( ) 办法批改图片的大小。此办法的参数必须是 2元组类型。*,返回一个图片正本。
Tip: 不是间接批改原图片的大小(原图片是以 r 模式关上的)。相似于按给定的大小在原图片做插值运算后从新生成一张图片。
# 返回一个新的 PIL.Image.Image 对象img=img.resize((300,300))
批改的图片的色彩模式: 能够应用图片对象的 conver( ) 办法批改图片模式 。能够取值范畴: 1、L、P、RGB、RGBA、CMYK、YCbCr、I、F。返回的也是一个图片正本。
1 模式: 黑白图片模式,每一个像素只有黑或白两个色彩。
from PIL import Imageimg = Image.open("dog.jpg", mode="r")img1 = img.convert('1')img.show()
L 模式: 生成灰度图片,每一个像素的色彩会从新按 L = R 299/1000 + G 587/1000 + B * 114/1000 进行换算。
Tip: 当像素点的 RGB 色彩重量雷同时,组合进去的就是灰色。灰色系有 256 阶梯,从 0~255。0 示意彩色,255 示意红色,从0到255 色彩由黑逐步转向白。
#000 彩色,#111、 # 222、 #333 ……逐步到 #FFF 红色。灰度图片要比黑白图片的色彩档次
丰盛
from PIL import Imageimg = Image.open("dog.jpg", mode="r")img = img.convert('L')img.show()
当把 RGBA 模式转换成 RGB 模式时,只会获取其中的 RGB 色彩通道(舍弃通明信息)。当由 RGB 模式转换成 RGBA 模式时。会主动增加 A 通道,补值为 255。
from PIL import Imageimg = Image.open("dog.jpg", mode="r")print(img.mode)print(img.getpixel((1, 1)))img = img.convert("RGBA")# 应用 getpixel( ) 办法获取任意一点的色彩模式print(img.getpixel((1, 1)))print(img.mode)'''输入后果RGB(207, 209, 222)(207, 209, 222, 255)RGBA'''
- 保留图片。图片批改后能够应用 save( ) 办法对其保留。
def save(self, fp, format=None, **params):
save( ) 办法的参数阐明:
- fp: 字符串形容的文件名或一个文件对象。
- format: 保留时指定图片的格局(JPG、PNG……)。如果省略此参数,则由文件的扩展名确定。如果 fp 是一个文件对象,此参数不能省略。
- params: 扩大参数。
保留图片的正本:除了文件名不一样,其它数据信息都是雷同。
from PIL import Imageimg = Image.open("dog.jpg")img.save("dog_01.jpg")
保留时批改图片格式:
from PIL import Image# 原图片格式为 jpgimg = Image.open("dog.jpg")print("dog.jpg图片的色彩模式:", img.mode)# 保留后图片的格局为 pngimg.save("dog_02.png")img = Image.open("dog_02.png")print("dog_02.png的色彩模式:", img.mode)'''输入后果dog.jpg图片的色彩模式: RGBdog_02.png的色彩模式: RGB'''
Tip: dog.jpg 图片是 RGB 模式,尽管在保留时指定 PNG 扩展名,但零碎不会增加 A 通道, dog_02.png 图片的色彩模式还是 RGB 模式。
如下代码会抛异样:因为无奈将 RGBA 模式的图片以 JPEG 格局保留
from PIL import Image# png 格局的图片有通明通道,其色彩模式是 RGBA.img = Image.open("guo_ke.png")print(img.mode)# jpg 格局的图片没有通明通道img.save("guo_ke.jpg")'''输入后果OSError: cannot write mode RGBA as JPEG'''
3.2 变形操作
变形操作包含对图片的旋转、裁剪、复制和粘贴一系列操作。
rotate( )办法: 此办法应用一个角度值旋转图片,返回图片正本。
角度为正值时以逆时针方向旋转,负值向顺时针方向旋转.能够通过调整角度,让图片程度或垂直方向翻转。
from PIL import Imageimg = Image.open("dog.jpg")img=img.rotate(30)img.show()
默认状况下,图片旋转后的空白处填充彩色。能够应用 rotate( )办法 的 fillcolor 参数为图片旋转后留下的空白处指定填充色彩。
from PIL import Imageimg = Image.open("dog.jpg")img=img.rotate(-45,fillcolor="blue")img.show()
能够应用 rotate( )办法 的 center 参数调整图片的中心点的地位。
from PIL import Imageimg = Image.open("dog.jpg")img = img.rotate(45, fillcolor="blue", center=(20, 20))img.show()
crop( ) 办法: 裁剪图片,裁剪时须要在原图片中确定一个须要保留的矩形区域。此办法返回一个图片正本。
from PIL import Imageimg = Image.open("dog.jpg")# 4 元组,前 2 个数字 示意矩形的左上角,后 2 个数字 示意矩形的右下角img = img.crop((0, 0, 400, 400))img.show()
图片的坐标系,图片的最左上角为原点,程度向右为 X 正轴,垂直向下为 正轴.
裁剪后的图片
copy( )办法: 复制图片,返回和原图片齐全一样的图片正本。图片正本和原图片之间是齐全独立的,批改其中的一张图片不会影响另一张图片。
paste( )办法: 粘贴图片,能够把一张图片粘贴到另一张图片上。如把小狗的图片粘贴到背景图片上。
def paste(self, im, box=None, mask=None):
参数阐明:
- im: 须要被粘贴的图片(这里是小狗图片)。
- box: 图片被粘贴的地位。box 能够是一个 2 元组,这 2 个示意小狗图片的左上角在背景图片上的地位。如果是 4 元组,则被粘贴的图片(小狗图片)必须和 4 元组所形容的矩形区域的大小一样。
- mask:遮罩图片,遮罩图片最好有透明性,如 PNG 图片。
from PIL import Image# 关上背景图片back_img = Image.open("back_.jpg")# 关上小狗图片dog_img = Image.open("dog.jpg")# 批改小狗的大小dog_img = dog_img.resize((180, 120))# 复制图片back_copy_img = back_img.copy()# (300,200) 或(300,200,480,320)back_copy_img.paste(dog_img, (300, 200))back_copy_img.show()
遮罩图片的应用,遮罩图片只能是 "1", "L" or "RGBA" 模式的图片,且遮罩图片和被粘贴的图片大小必须一样。
from PIL import Image# 关上背景图片back_img = Image.open("back_.jpg")# 关上小狗图片dog_img = Image.open("dog.jpg")# 批改小狗的大小dog_img = dog_img.resize((180, 120))# 复制图片back_copy_img = back_img.copy()# 遮罩图片 须要有透明度信息mask_img = Image.open("js.png")# 批改 遮罩图片 和 小狗图片一样大小mask_img = mask_img.resize((180, 120))# 粘贴back_copy_img.paste(dog_img, box=(300, 200, 480, 320), mask=mask_img)back_copy_img.show()
3.3 合并色彩通道
RGB色彩模式的图片有 3 个色彩通道,RGBA 色彩模式的图片有 3 个色彩通道另加 1 个透明度通道。能够应用 split( ) 办法 拆散出图片的色彩通道,而后依据本人的须要再重新排列色彩通道失去不同成果的图片。
拆散小狗图片的色彩通道,并重组色彩通道 。merge( ) 办法能通过指定的色彩通道创立一张新图片。
from PIL import Imagedog_img = Image.open("dog.jpg")# 拆散色彩通道r, g, b = dog_img.split()# 打乱色彩通道失去新图片 蓝色通道和红色通道调换dog_img = Image.merge(dog_img.mode, (b, g, r))dog_img.show()
能够对分离出来的色彩通道进行独自批改批改,批改后再重组出新的图片。
from PIL import Imagedog_img = Image.open("dog.jpg")# 拆散色彩通道r, g, b = dog_img.split()# 批改每一个色彩通道中的像素点的值r = r.point(lambda i: i + 10)g = r.point(lambda i: i * 0.6)b = b.point(lambda i: i + 100)dog_img = Image.merge(dog_img.mode, (r, g, b))dog_img.show()
上面的代码应用 getpixel( ) 办法通过给定的坐标值找到每一点的色彩模式。而后对每一个像素点的色彩模式进行重构。
from PIL import Imagedog_img = Image.open("dog.jpg")w, h = dog_img.sizefor i in range(w): for j in range(h): # 获取每一个像素点的色彩模式 c = dog_img.getpixel((i, j)) # 批改每一个像素点的色彩模式 红色减轻,绿色缩小。 dog_img.putpixel((i, j), (c[0] + 100, c[1] - 20, c[2] + 30))dog_img.show()
重组不同图片中的色彩通道,要求所有图片的大小都一样。
from PIL import Imagedog_img = Image.open("dog.jpg")# 拆散色彩通道r, g, b = dog_img.split()img1 = Image.open("guo_ke.png")#两张图片的大小一样img1=img1.resize(dog_img.size)# js.png 色彩模式是 rgbar1,g1,b1,a=img1.split()# 混合 两张图片的不同通道img=Image.merge("RGBA",(r1,g,b1,a))img.show()
3.4 滤镜和减少
能够像 PS 一样给图片增加滤镜,并且能够调整图片的对比度,色调……等信息。
ImageFilter 模块提供有各种滤镜对象,图片应用滤镜后会返回一个图片正本。
- BLUR:含糊成果
- CONTOUR:轮廓成果
- DETAIL:细节成果
- EDGR_ENHANCE:边界加强成果
- EDGE_ENHANCE_MODE:阈值边界加强成果
- EMBOSS:浮雕成果
- FIND_EDGES:边界成果
- SMOOTH:平滑成果
- SMOOTH_MODE:阈值平滑成果
- SHARPEN:锐化成果
给小狗图片增加滤镜成果:
from PIL import ImageFilterfrom PIL import Imagedog_img = Image.open("dog.jpg")# 浮雕成果dog_img = dog_img.filter(ImageFilter.EMBOSS)dog_img.show()
其它的成果大家能够本人试一试。
ImageEnhance 类提供有批改图片对比度,色调等信息的对象。这些对象都有一个 enhance(factor) 办法用来设置加强的强度。
- Color(im):调整色彩均衡
- Contrast(im):调整对比度
- Brightness(im):调整亮度
- Sharpness(im):调整锐度
加强图片的高度:
from PIL import ImageFilterfrom PIL import Imagefrom PIL import ImageEnhancedog_img = Image.open("dog.jpg")dog_img = dog_img.filter(ImageFilter.SHARPEN)# 构建 Brightness 对象dog_img=ImageEnhance.Brightness(dog_img)# 调用 Brightness 对象的enhance()设置减少的数值dog_img.enhance(2).show()
4 . 总结
本文介绍了 PIL 库的 ImageColor、Image、ImageFilter、ImageEnchance 模块。除此之外,PIL 中还有很多与图片解决相干的模块。应用这些模块,简直能够实现 PS 中能实现的工作。
对于图片解决还有些高级利用,有工夫再另开拓新文。