Python拼接微信好友头像大图的实现方法


Posted in Python onAugust 01, 2018

基于 itchat 库来获取微信好友头像并执行拼接操作,对微信上文字化好友列表数据进行可视化展示。

Python拼接微信好友头像大图的实现方法

获取好友头像

def save_avatar(folder):
 """
 保存微信好友头像
 :param folder: 保存的文件夹
 """
 itchat.auto_login(hotReload=True)
 users = itchat.get_friends() or []
 print('%d friends found.' % len(users))
 if not os.path.exists(folder):
  os.makedirs(folder)
 index = 1
 for i, user in enumerate(users):
  nickname = user.RemarkName
  username = user.UserName
  file_path = os.path.join(folder, '%03d_%s.png' % (i, nickname))
  if not os.path.isfile(file_path): # 不重复下载
   avatar = itchat.get_head_img(username)
   with open(file_path, 'w') as f:
    f.write(avatar)
    print('Download %d: %s' % (index, file_path))
    index += 1

这里只需要传入一个保存头像的文件夹即可,运行 itchat.auto_login(hotReload=True) 后会弹出微信扫码界面让你授权微信登录,以便接下来的好友数据获取。

在图片下载时,我添加了一个防止重复下载的判断,以免多次运行时每次都要重新进行头像的下载。

取出待拼接头像

def get_image_files(folder, filters=None):
 """
 取出待拼接头像
 :param folder: 目标文件夹
 :param filters: 需要过滤的图片
 :return: 头像路径
 """
 filters = filters or []
 filenames = [os.path.join(folder, sub) for sub in os.listdir(folder)
     if sub.endswith('.png') and not filters.__contains__(sub)]
 return filenames

这里单独写个方法是为了把过滤的逻辑封装进来,以便于去掉指定的微信好友的头像(比如纯色的头像在拼接之后的大图看上去很明显,非强迫症可忽略)。

计算拼接的排列

def calculate_align_way(image_num, force_align=False):
 """
 计算图片排版对齐方式
 :param image_num: 图片数量
 :return: (rowls, columns)
 """
 actual_value = image_num ** 0.5
 suggest_value = int(actual_value)
 if actual_value == suggest_value or force_align:
  return suggest_value, suggest_value
 else:
  return suggest_value, suggest_value + 1

因为需要知道最终拼接图片的行列数,所有这里单独定义一个计算方法。算法就是直接对图片总数开根号,取出的结果如果正好是整数,就直接返回该结果。如果不是整数(大多数情况都如此),则根据参数 force_align 来决定是否强制进行正好全部铺满的显示。如果设为 True ,能强制铺满,但会有部分好友未显示完全;反之则是相对的情况。 后面发现拼接图片最后一行有很多黑色空位时,只需要更改该参数为True即可。

拼接

def join_images(image_files, rows, cols, width, height, save_file=None):
 """
 拼接操作
 :param image_files: 待拼接的图片
 :param rows: 行数
 :param cols: 列数
 :param width: 每张小头像的宽度
 :param height: 每张小头像的高度
 :param save_file: 拼接好图片的保存路径
 """
 canvas = np.ones((height * rows, width * cols, 3), np.uint8)
 for row in range(rows):
  for col in range(cols):
   index = row * cols + col
   if index >= len(image_files):
    break
   file_path = image_files[index]
   im = Image.open(file_path)
   im = im.resize((width, height))
   im_data = np.array(im)
   if len(im_data.shape) == 2:
    im_data = np.expand_dims(im_data, -1)
   x = col * width
   y = row * height
   canvas[y: y + height, x: x + width, :] = im_data
 image = Image.fromarray(canvas)
 image.show()
 if save_file:
  image.save(save_file)

拼接图片调用的是科学计算包 numpy 和图片库 PIL ,主要就是对 ndarray 进行操作。

最终将上面的步骤全部串联起来,执行如下主函数,便得到上面的拼接图片。

FOLDER = 'avatars'

if __name__ == '__main__':
 # 保存所有好友头像
 save_avatar(FOLDER)

 # 取到准备拼接的头像
 image_files = get_image_files(FOLDER)

 # 计算拼接的行列
 rows, columns = calculate_align_way(len(image_files), force_align=True)

 # 执行拼接操作
 join_images(image_files, rows, columns, 64, 64, 'result.png')

Github源码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现抓取城市的PM2.5浓度和排名
Mar 19 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
Jul 02 Python
轻松掌握python设计模式之访问者模式
Nov 18 Python
Windows下安装python2和python3多版本教程
Mar 30 Python
基于Python实现的微信好友数据分析
Feb 26 Python
详解如何为eclipse安装合适版本的python插件pydev
Nov 04 Python
Python pygame绘制文字制作滚动文字过程解析
Dec 12 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
python安装和pycharm环境搭建设置方法
May 27 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 Python
python不同版本的_new_不同点总结
Dec 09 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 #Python
Python常见内置高效率函数用法示例
Jul 31 #Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 #Python
flask-socketio实现WebSocket的方法
Jul 31 #Python
深入flask之异步非堵塞实现代码示例
Jul 31 #Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 #Python
Windows下python3.6.4安装教程
Jul 31 #Python
You might like
如何在PHP中使用Oracle数据库(2)
2006/10/09 PHP
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
深入分析php之面向对象
2013/05/15 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
PHP函数用法详解【初始化、嵌套、内置函数等】
2020/06/02 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
JavaScript动态添加style节点的方法
2015/06/09 Javascript
JavaScript多线程详解
2015/08/12 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
uni-app 自定义底部导航栏的实现
2020/12/11 Javascript
[01:48:04]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第一场 2月7日
2021/03/11 DOTA
python目录操作之python遍历文件夹后将结果存储为xml
2014/01/27 Python
Python多线程编程(一):threading模块综述
2015/04/05 Python
Python连接MySQL并使用fetchall()方法过滤特殊字符
2016/03/13 Python
Python2和Python3中print的用法示例总结
2017/10/25 Python
python机器学习之决策树分类详解
2017/12/20 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
财务出纳员岗位职责
2013/11/26 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
优秀小学生家长评语
2014/01/30 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
村容村貌整治方案
2014/05/21 职场文书
工程项目经理任命书
2014/06/05 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
Python 全局空间和局部空间
2022/04/06 Python
移除Selenium中window.navigator.webdriver值
2022/06/10 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android