Python关于PIL库的学习总结与成果展示
一、关于PIL库的学习总结
PIL(Python Image Library)库是Python语言的第三方库,需要通过pip工具安装。安装PIL库的方法如下,需要注意,安装库的名字是pillow。
:\>pip install pillow #或者 pip3 install pillow
PIL库支持图像储存、显示和处理,他能够处理几乎所有图片格式,可以完成对图像的缩放、剪裁、叠加以及向图像添加线条、图像和文字等操作。
PIL库主要可以实现图像归档和图像处理两方面功能需求。
(1)图像归档:对图像进行批处理、生成图像预览、图像格式转换等。
(2)图像处理:图像基本处理、像素处理、颜色处理等。
根据功能不同,PIL库共包括21个与图片相关的类,这些类可以被看作是子库或PIL库中的模块,子库列表如下:
Image、ImageChops、ImageColor、ImageCrackCode、ImageDraw、Image Enhance、ImageFile、ImageFileIO、ImageFilter、Image Font、ImageGL、ImageGrab、Imagemath、ImageOps、ImagePalette、ImagePath、ImageQt、ImageSequence、ImageStat、ImageTk、ImageWin
下面是关于PIL库的快速参考图
二、略缩图制作
略缩图就是将一个较大的图片进行一定比例的缩小以节省储存空间而又不影响浏览。在许多网页中,为了减少用户在浏览过程中加载图片的时间,一般会将图片变成略缩图。
下面我们来看一下利用Python将图片做成略缩图的代码:
1 from PIL import Image 2 im = Image.open("Avenger.jpg")#此处为打开的图片名,注意将要操作的图片放置到与程序相同的目录下 3 im.thumbnail((128,128)) #此处的128,128是指略缩图的像素尺寸为128*128,可根据自身需要进行修改 4 im.save("Avenger.jpg","JPEG") #此处两个双引号分别表示略缩图的文件名和略缩图格式
效果如下:
原图(7680*4320)
略缩图(128*128)
三、改变图片颜色
RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
下面我们就针对图片这三个颜色通道进行变色,代码如下:
1 from PIL import Image 2 im = Image.open("Endgame.jpg") #打开目标图片 3 r,g,b=im.split() 4 om = Image.merge("RGB",(b,g,r))#在(b,g,r)将三个字母进行交换得到效果图 5 om.save('Endgame.jpg') #储存文件名
效果如下
原图
变色后的图
emmmmmm...看起来怪怪的,但是效果总归是出来了。
四、将gif图逐帧分解
gif图片就像是视频一样,由一张张静态图片组成,因为各张图片之间都有一定的连续性,我们看到的gif图中人物动作没有丝毫卡顿,非常流畅,有时我们希望能捕捉到动图中的某一帧,这就需要将gif图分解了,下面我们来看看如何将一张gif图逐帧分解。
代码如下:
1 from PIL import Image 2 im = Image.open('真香.gif') #打开待处理的图片 3 try: 4 im.save('picframe{:02d}.png'.format(im.tell())) 5 while True: 6 im.seek(im.tell()+1) 7 im.save('picframe{:02d}.png'.format(im.tell()))#以png格式储存动图的每一帧 8 except: 9 print("处理结束") #提示程序的处理进度
效果如下
原图
效果图
由于这张动图的帧比较多,我就只发了其中几张
五、中文字符画
之前在网络上看见过利用txt文件播放一个视频,甚是新奇。今天,虽然还不能做到播放视频,但是利用字符形式查看一张图片还是可以的,下面就看看效果吧!
代码如下
1 from PIL import Image 2 ascii_char = list('"$%_&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-/+@<>i!;:,\^`.') 3 def get_char(r, b, g, alpha=256): 4 if alpha == 0: 5 return ' ' 6 gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b) 7 unit = 256 / len(ascii_char) 8 return ascii_char[int(gray//unit)] 9 def main(): 10 im = Image.open('1.jpg') 11 WIDTH, HEIGHT = 100, 60 12 im = im.resize((WIDTH, HEIGHT)) 13 txt = "" 14 for i in range(HEIGHT): 15 for j in range(WIDTH): 16 txt += get_char(*im.getpixel((j, i))) 17 txt += '\n' 18 fo = open("pic_char.txt","w") 19 fo.write(txt) 20 fo.close() 21 main()
原图
效果图
效果还是比较好的,至少看得清楚轮廓。可能是因为我的电脑本身的问题,在txt中打开时根本无法看不出这个效果,后面我在word文档中打开,就有了上面的效果图,如果你尝试后发现也是如此,不妨试试将其复制到word文档中查看,也许效果就出来了。
六、拼接gif图
既然可以将一张gif动图逐帧分解,自然也能将gif动图逐帧拼接,话不多说,直接上代码:
1 import PIL.Image as Image 2 3 4 def get_gif(pics_dir,n,t):#此处n代表拼接图片的数量,t是指各张图片之间变换的时间间隔 5 imgs = [] 6 for i in range(n): 7 pic_name = '{}.jpg'.format(i) 8 temp = Image.open(pic_name) 9 imgs.append(temp) 10 save_name = '{}.gif'.format(pics_dir) 11 imgs[0].save(save_name, save_all=True, append_images=imgs, duration=t) 12 return save_name 13 14 15 if __name__ == '__main__': 16 pics_dir = '路人甲' 17 save_name = get_gif(pics_dir,8,500) 18 print('制作完成。所属文件:{}'.format(save_name))
所需拼接的图片
效果图
虽然不是完全连续的,但至少看起来还是相关的(给自己找借口)
关于PIL库的学习展示就是这些啦!