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 isinstance判断对象类型
Sep 06 Python
Python中的并发编程实例
Jul 07 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
Python实现通讯录功能
Feb 22 Python
python定向爬取淘宝商品价格
Feb 27 Python
python实现机器学习之元线性回归
Sep 06 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
django模板结构优化的方法
Feb 28 Python
python性能测量工具cProfile使用解析
Sep 26 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
Python 数据分析之逐块读取文本的实现
Dec 14 Python
详解Django的MVT设计模式
Apr 29 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
一个简单计数器的源代码
2006/10/09 PHP
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
phpwind放自动注册方法
2006/12/02 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
2012/02/03 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
BootStrap智能表单实战系列(七)验证的支持
2016/06/13 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
微信小程序按钮去除边框线分享页面功能
2018/08/27 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
Python中过滤字符串列表的方法
2020/12/22 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
日本乐天官方海外转运服务:Rakuten Global Express
2018/11/30 全球购物
环保建议书
2014/03/12 职场文书
部门活动策划方案
2014/08/16 职场文书
2014年党总支工作总结
2014/12/18 职场文书
2015年教师业务工作总结
2015/05/26 职场文书
python process模块的使用简介
2021/05/14 Python