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编程入门之Hello World的三种实现方式
Nov 13 Python
浅谈tensorflow中几个随机函数的用法
Jul 27 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
详解Python 调用C# dll库最简方法
Jun 20 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python 3.6.7实现端口扫描器
Sep 04 Python
Python小整数对象池和字符串intern实例解析
Mar 21 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
详解如何修改python中字典的键和值
Sep 29 Python
Python中Yield的基本用法
Oct 18 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 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安装攻略:常见问题解答(一)
2006/10/09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php blowfish加密解密算法
2016/07/02 PHP
php的api数据接口书写实例(推荐)
2016/09/22 PHP
YII2 实现多语言配置的方法分享
2017/01/11 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
jQuery Ajax请求状态管理器打包
2012/05/03 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
js onmousewheel事件多次触发问题解决方法
2014/10/17 Javascript
javascript绘制漂亮的心型线效果完整实例
2016/02/02 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
2016/05/18 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
2017/08/04 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
python获取中文字符串长度的方法
2018/11/14 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
AmazeUI 面板的实现示例
2020/08/17 HTML / CSS
经典禁毒标语
2014/06/16 职场文书
无保留意见审计报告
2015/06/05 职场文书
2019思想汇报范文
2019/05/21 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
Nginx配置https的实现
2021/11/27 Servers
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技