首页 > 技术文章 > 爬虫笔记:使用python拼接所有好友的头像(九)

wxcx 2020-05-11 22:54 原文

这篇博客介绍一下怎么用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模式是一种色彩模式

  

推荐阅读