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通过装饰器检查函数参数数据类型的方法
Mar 13 Python
举例简单讲解Python中的数据存储模块shelve的用法
Mar 03 Python
Python实现破解12306图片验证码的方法分析
Dec 29 Python
python爬取个性签名的方法
Jun 17 Python
Django 实现购物车功能的示例代码
Oct 08 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
Pytorch实现神经网络的分类方式
Jan 08 Python
python with语句的原理与用法详解
Mar 30 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 Python
python实现b站直播自动发送弹幕功能
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
图解上海144收音机
2021/03/02 无线电
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP如何抛出异常处理错误
2011/03/02 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
图片自动更新(说明)
2006/10/02 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
JavaScript实现的可变动态数字键盘控件方式实例代码
2017/07/15 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
[44:15]国士无双DOTA2 6.82版本详解(上)
2014/09/28 DOTA
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python中urllib2模块的8个使用细节分享
2015/01/01 Python
如何使用python爬取csdn博客访问量
2016/02/14 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python构建指数平滑预测模型示例
2019/11/21 Python
python 消费 kafka 数据教程
2019/12/21 Python
Python批量安装卸载1000个apk的方法
2020/04/10 Python
Python Map 函数的使用
2020/08/28 Python
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
应聘教师求职信
2014/07/19 职场文书
八一建军节演讲稿
2014/09/10 职场文书
小学英语教师2015年度个人工作总结
2015/10/14 职场文书
导游词之上海豫园
2019/10/24 职场文书
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android
nginx七层负载均衡配置详解
2022/07/15 Servers