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实现基于权重的随机数2种方法
Apr 28 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
简单的python后台管理程序
Apr 13 Python
django定期执行任务(实例讲解)
Nov 03 Python
django数据库migrate失败的解决方法解析
Feb 08 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
python设定并获取socket超时时间的方法
Jan 12 Python
Django框架用户注销功能实现方法分析
May 28 Python
Django RBAC权限管理设计过程详解
Aug 06 Python
python实现飞船大战
Apr 24 Python
python两个list[]相加的实现方法
Sep 23 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 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解析json数据实例
2014/08/19 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
使用Modello编写JavaScript类
2006/12/22 Javascript
javascript 播放器 控制
2007/01/22 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python验证码识别的方法
2015/07/10 Python
python实现批量监控网站
2016/09/09 Python
django 修改server端口号的方法
2018/05/14 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
心得体会开头
2014/01/01 职场文书
单位绩效考核方案
2014/05/11 职场文书
考生诚信考试承诺书
2014/05/23 职场文书
个人四风问题整改措施
2014/10/24 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
开学第一周日记(三篇范文)
2019/08/23 职场文书
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js
Python使用pyecharts控件绘制图表
2022/06/05 Python