PIL库概述
PIL库是Python的优秀第三方库,它需要通过pip安装:
pip install pillow
PIL库支持图像存储、显示和处理,它能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。
PIL库Image类解析
在PIL中,任何一个图像文件都可以用Image对象表示Image类的图像读取和创建方法:
Image.open(filename) #根据参数加载图像文件 Image.new(mode, size, color) #根据给定参数创建一个新的图像 Image.open(StringIO.StringIO(buffer)) #从字符串中获取图像 Image.frombytes(mode, size, data) #根据像素点data创建图像 Image.verify() #对图像文件完整性进行检查,返回异常
Image类有4个处理图片的常用属性 :
Image.format #标识图像格式或来源,如果图像不是从文件读取,值是None Image.mode #图像的色彩模式,"L"灰度图像、"RGB"真彩色图像、"CMYK"出版图像 Image.size #图像宽度和高度,单位是像素(px),返回值是二元元组(tuple) Image.palette #调色板属性,返回一个ImagePalette类型
Image类图片有3种转换和保存方法:
Image.save(filename, format) #将图像保存为filename文件名,format是图片格式 Image.convert(mode) #使用不同的参数,转换图像为新的模式 Image.thumbnail(size) #创建图像的缩略图,size是缩略图尺寸的二元元组
Image类图片缩放和旋转方法:
Image.resize(size) #按size大小调整图像,生成副本 Image.rotate(angle) #按angle角度旋转图像,生成副本
Image类能够对每个像素点或者一幅RGB图像的每个通道单独进行操作,split()方法能够将RGB图像各颜色通道提取出来,merge()方法能够将各独立通道再合成一幅新的图像:
Image.point(func) #根据函数func功能对每个元素进行运算,返回图像副本 Image.split() #提取RGB图像的每个颜色通道,返回图像副本 Image.merge(mode,bands) #合并通道 ,采用mode色彩,bands是新色的色彩通道 Image.blend(im1,im2,alpha)
其中Image.blend(im1,im2,alpha)将两幅图片im1和im2按照如下公式插值后生成新的图像: im1 * (1.0-alpha) + im2 * alpha
PIL库的ImageFilter类和ImageEnhance类提供了过滤图像和增强图像的方法,共10种:
ImageFilter.BLUR #图像的模糊效果 ImageFilter.CONTOUR #图像的轮廓效果 ImageFilter.DETAIL #图像的细节效果 ImageFilter.EDGE_ENHANCE #图像的边界加强效果 ImageFilter.EDGE_ENHANCE_MORE #图像的阈值边界加强效果 ImageFilter.EMBOSS #图像的浮雕效果 ImageFilter.FIND_EDGES #图像的边界效果 ImageFilter.SMOOTH #图像的平滑效果 ImageFilter.SMOOTH_MORE #图像的阈值平滑效果 ImageFilter.SHARPEN #图像的锐化效果
ImageEnhance类提供了更高级的图像增强需求,它提供调整色彩度、亮度、对比度、锐化等功能:
ImageEnhance.enhance(factor) #对选择属性的数值增强factor倍 ImageEnhance.Color(im) #调整图像的颜色平衡 ImageEnhance.Contrast(im) #调整图像的对比度 ImageEnhance.Brightness(im) #调整图像的亮度 ImageEnhance.Sharpness(im) #调整图像的锐度
获取缩略图
from PIL import Image im = Image.open("C:\\bachongying.jpg") im.thumbnail((128,128)) im.save('1bachongying.jpg')
获取图片轮廓
from PIL import Image from PIL import ImageFilter im = Image.open("C:\\bachongying.jpg") om = im.filter(ImageFilter.CONTOUR) om.save('bachongying2.jpg')
图片浮雕化
from PIL import Image from PIL import ImageFilter im = Image.open("C:\\bachongying.jpg") om = im.filter(ImageFilter.EMBOSS) om.save('bachongying3.jpg')
做一幅中文字符画
from PIL import Image ascii_char = list('学习使我快乐') def get_char(r, b, g, alpha=256): if alpha == 0: return ' ' gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) unit = 256 / len(ascii_char) return ascii_char[int(gray//unit)] def main(): im = Image.open('C:\\bachongying.jpg') WIDTH, HEIGHT = 100, 60 im = im.resize((WIDTH, HEIGHT)) txt = "" for i in range(HEIGHT): for j in range(WIDTH): txt += get_char(*im.getpixel((j, i))) txt += '\n' fo = open("pic_char.txt","w") fo.write(txt) fo.close() main()