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之正规地说一句话
Sep 28 Python
Python入门篇之条件、循环
Oct 17 Python
详解Python字符串对象的实现
Dec 24 Python
使用Python的turtle模块画图的方法
Nov 15 Python
聊聊Python中的pypy
Jan 12 Python
python opencv之SURF算法示例
Feb 24 Python
python 实现A*算法的示例代码
Aug 13 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
Python flask路由间传递变量实例详解
Jun 03 Python
用python实现一个简单的验证码
Dec 09 Python
python函数的两种嵌套方法使用
Apr 02 Python
Python os和os.path模块详情
Apr 02 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
对squid中refresh_pattern的一些理解和建议
2009/04/17 PHP
php中几种常见安全设置详解
2010/04/06 PHP
提高PHP性能的编码技巧以及性能优化详细解析
2013/08/24 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
javascript hashtable实现代码
2009/10/13 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
js 数值转换为3位逗号分隔的示例代码
2014/02/19 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
JavaScript中最常见的三个面试题解析
2017/03/04 Javascript
Vue实现动态响应数据变化
2017/04/28 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
vue项目中引入vue-datepicker插件的详解
2019/05/14 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
python笔记(1) 关于我们应不应该继续学习python
2012/10/24 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python3生成手写体数字方法
2018/01/30 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
Python 求向量的余弦值操作
2021/03/04 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
非功能性需求都包括哪些方面
2013/10/29 面试题
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
开工典礼致辞
2015/07/29 职场文书
会计实训总结范文
2015/08/03 职场文书
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers