• 爬虫笔记:使用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:PycharmProjectslianxiweixintouxiang/*.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模式是一种色彩模式
    

      

  • 相关阅读:
    Tcpdump抓包
    关于Adroid Bitmap OutOfMemoryError的问题解决
    java用substring函数截取string中一段字符串
    偶耶DIY布偶成都实体店开业
    瑞士Kardex(卡迪斯)自动化仓储货柜,Shuttle XP系列升降库驱动监控系统
    360顽固木马专杀工具 千万别用 会删除Oracle服务
    天上人和酒店管理系统(.net3.5 + sql2000 + linq to sql)
    [转]VC++中CListCtrl listcontrol用法技巧
    [转]孙鑫教程学习笔记
    [转]VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程
  • 原文地址:https://www.cnblogs.com/wxcx/p/12872855.html
Copyright © 2020-2023  润新知