01
前言
Hello~各位小伙伴们大家好。现在大家是越来越离不开手机,离不开微信了。每天打开手机的第一或者第二件事就是赶紧打开朋友圈看看有什么好玩的东西。偶尔忍不住了自己也发两条……好了,今天教大家用Python发一个不一样的朋友圈。
效果如下:
看出什么来了吗?没错,我们把一张图片切成了9张,然后利用朋友圈的9宫格显示,得到了挺不错的效果。好了,废话少说,下面开工。
02
环境准备
Python版本:3.6.0
系统平台:Windows 10 X64
IDE:pycharm
相关模块:
PIL模块;
Image模块;
以及一些Python自带的模块。
03
PIL库介绍
对于图像识别,大量的工作在于图像的处理,处理效果好,那么才能很好地识别,因此,良好的图像处理是识别的基础。在Python中,有一个优秀的图像处理框架,就是PIL库。由于PIL只支持Python2.7,所以使用Python3的程序猿们又在PIL的基础上分离出来了一个分支,创建了另外一个库Pillow,是可以支持Python3的。
Pillow兼容了PIL的大部分语法,使用起来也非常的简单。Pillow 是 PIL的对Python3支持的另外一个分支,当然他对Python2也兼容,由于PIL安装起来比较烦,而使用pip可以很轻松的安装Pillow:
Python 2.7
PIL: pip install pillow
Python 3
PIL: pip3 install pillow
Image类是PIL中的核心类,你有很多种方式来对它进行初始化,比如从文件中加载一张图像,处理其他形式的图像,或者是从头创造一张图像等。
04
切割图片
上面说了这么多,接下来我们就要用这个PIL库进行图片切割啦。不过先做两点说明:如果是正方形图片,直接切割;如果不是正方形图片,用白色填充成正方形再切割。大体步骤如下:
1、读取图片。
1if __name__ == '__main__': 2 file_path = "F:\\17-个人博客\\Python高逼格朋友圈\\998.jpg" 3 image = Image.open(file_path)
这一步很简单,从文件加载图像,用Image函数的open方法。如果成功,这个函数将返回一个图像对象。
2、填充图片。
1# 先将 input image 填充为正方形 2def fill_image(image): 3 width, height = image.size 4 # 选取长和宽中较大值作为新图片的 5 new_image_length = width if width > height else height 6 # 生成新图片[白底] 7 new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white') # 注意这个函数! 8 # 将之前的图粘贴在新图上,居中 9 if width > height: # 原图宽大于高,则填充图片的竖直维度 #(x,y)二元组表示粘贴上图相对下图的起始位置,是个坐标点。 10 new_image.paste(image, (0, int((new_image_length - height) / 2))) 11 else: 12 new_image.paste(image, (int((new_image_length - width) / 2), 0)) 13 return new_image
首先用PIL库下的Image类创建一个正方形新图(边长我们选择原图中长宽较大的那个),将之前的图片粘贴到新图上面。这样,一张图片就算是填充好啦。
3、切割图片。
1# 先将 input image 填充为正方形 2def cut_image(image): 3 width, height = image.size 4 item_width = int(width / 3) # 因为朋友圈一行放3张图。 5 box_list = [] 6 # (left, upper, right, lower) 7 for i in range(0, 3): 8 for j in range(0, 3): 9 # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width)) 10 box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width) 11 box_list.append(box) 12 image_list = [image.crop(box) for box in box_list] 13 return image_list
然后进行循环切片,首先是在图片上定位好我们box的区域(相当于圈出一块将要切掉的图片),注意区域由一个4元组定义,表示为坐标是 (left, upper, right, lower)。 Python Imaging Library 使用左上角为 (0, 0)的坐标系统。然后添加到box_list中,最后用crop方法将其切下来,保存到image_list中。
4、保存图片。
1# 保存 2def save_images(image_list): 3 index = 1 4 for image in image_list: 5 image.save('F:\\17-个人博客\\Python高逼格朋友圈\\' + str(index) + '.png', 'PNG') 6 index += 1
保存图片简单了,注意你们的保存路径就行。
05
完整代码
1''''' 2将一张图片填充为正方形后切为9张图 3Author:微信公众号:程序猿声 4''' 5from PIL import Image 6 7 8# 先将 input image 填充为正方形 9def fill_image(image): 10 width, height = image.size 11 # 选取长和宽中较大值作为新图片的 12 new_image_length = width if width > height else height 13 # 生成新图片[白底] 14 new_image = Image.new(image.mode, (new_image_length, new_image_length), color='white') # 注意这个函数! 15 # 将之前的图粘贴在新图上,居中 16 if width > height: # 原图宽大于高,则填充图片的竖直维度 #(x,y)二元组表示粘贴上图相对下图的起始位置,是个坐标点。 17 new_image.paste(image, (0, int((new_image_length - height) / 2))) 18 else: 19 new_image.paste(image, (int((new_image_length - width) / 2), 0)) 20 return new_image 21 22 23def cut_image(image): 24 width, height = image.size 25 item_width = int(width / 3) # 因为朋友圈一行放3张图。 26 box_list = [] 27 # (left, upper, right, lower) 28 for i in range(0, 3): 29 for j in range(0, 3): 30 # print((i*item_width,j*item_width,(i+1)*item_width,(j+1)*item_width)) 31 box = (j * item_width, i * item_width, (j + 1) * item_width, (i + 1) * item_width) 32 box_list.append(box) 33 image_list = [image.crop(box) for box in box_list] 34 return image_list 35 36 37# 保存 38def save_images(image_list): 39 index = 1 40 for image in image_list: 41 image.save('F:\\17-个人博客\\Python高逼格朋友圈\\' + str(index) + '.png', 'PNG') 42 index += 1 43 44 45if __name__ == '__main__': 46 file_path = "F:\\17-个人博客\\Python高逼格朋友圈\\998.jpg" 47 image = Image.open(file_path) 48 # image.show() 49 image = fill_image(image) 50 image_list = cut_image(image) 51 save_images(image_list)
注:代码文件获取请移步到留言区。