爬虫笔记:使用python拼接所有好友的头像(九)
这篇博客介绍一下怎么用python把多张图片按比例缩小,拼成一张图片,比如说我要把我所有微信好友的头像,到一个图片里,如下图:
先分析下需求,把思路缕清
这个拼图片,就像要做一个照片墙一样,做照片墙怎么做呢,假如说现在有一块640*640的一块正方形的墙壁。
那我正常做的话,怎么办,肯定要先有一块640*640的墙,算出来这个墙的面积,然后算出来有多少张照片,拿总的面积除以照片的数量,就算出来了每张照片的面积,裁剪好大小正好的照片,这样子就可以把照片都贴到这块墙上了。
现在思路已经缕清了,要注意上面几个需要运算的数据
1、墙的面积
2、照片的数量
3、每个照片的面积
下面就可以来写代码了,写代码之前思考一个问题,自己贴照片的时候,一行一行开始贴,到这一行结束之后,第二行继续贴。但是程序是死的,他不可能有那么智能的,所以要先计算出来每行能贴多少张照片,然后贴的时候判断一下,如果这一行已经贴满了,那么我就从第二行开始。
那怎么算每行能贴多少照片呢,拿墙的长再除以每个照片的长度,就算出来了,所以还要计算出来每个照片的边长。
上面已经算出来了每个照片的面积了,正方形的面积等于边长的平方,所以对它进行开方就可以获取到边长了。
ok,需要用来计算的数据都已经好了。重新看下,然后下面开始写代码
1、墙的面积
2、照片的数量
3、每个照片的面积
4、每个照片的边长
5、每行能够贴的照片数量
处理图片需要用到PIL模块,直接pip 安装即可。pip install pillow,安装可能会报错,如果报错,打开这个网站,https://www.lfd.uci.edu/~gohlke/pythonlibs/,搜索PIL,然后下载自己对应的版本,手动安装即可。
import math # math模块计算平方根 from PIL import Image # 导入PIL模块,处理图片 import glob # glob模块,获取目录下的文件 size = 640 # 照片墙的边长 img1 = Image.new('RGBA', (size, size), 'white') # 生成一个680*680像素的图片 pics = glob.glob('E:\PycharmProjects\lianxi\weixintouxiang/*.jpg') # glob模块和os.listdir功能一样,获取某个目录下的文件,只不过是它可以支持模糊匹配,这个目录下有我已经下载好的微信头像 bianchang = int(math.sqrt(size * size / len(pics))) # 先用边长乘以边长算出来总面积,然后除以个数,就算出来每个头像的面积,然后面积开方就算出来了边长 line_num = int(size / bianchang) # 照片墙的边长除以照片的边长就是每行能放照片的数量 x = 0 # 列 y = 0 # 行 for f in pics: # 循环取到每个照片 img = Image.open(f) # 打开图片 img = img.resize((bianchang, bianchang), Image.ANTIALIAS) # resize方法是重置这个图片的尺寸,也就是他的面积,这里用传了2个边长,就算出来了面积 # Image.ANTIALIAS这个参数的意思是,重置尺寸了之后,高质量的图片 img1.paste(img, (x * bianchang, y * bianchang)) # 这里就开始粘贴图片了,(x,y)是列和行,第一开始是0,0在左上角贴了一张, # 这里乘以边长的意思就是,每张照片占的长度 x += 1 # 这个x其实就代表每行贴了几张了,每贴一张就加一 if x == line_num: # 这里判断了一下,这一行是否贴满了, # 如果贴满了就从第二行开始贴,列还是从第1列开始 x = 0 # 列从最前面开始 y += 1 # 第一行贴满了,那就从第二行开始了,行号+1 img1.save('wwww.png') # 保存图片,这里不能用jpg格式的,前面在创建图片的时候用的是RGBA模式的,只能用png结尾,RGBA模式是一种色彩模式