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 相关文章推荐
haskell实现多线程服务器实例代码
Nov 26 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
详解Python中的动态属性和特性
Apr 07 Python
python利用thrift服务读取hbase数据的方法
Dec 27 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
python with (as)语句实例详解
Feb 04 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
浅谈tensorflow模型保存为pb的各种姿势
May 25 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
May 28 Python
Python txt文件如何转换成字典
Nov 03 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
vuejs响应用户事件(如点击事件)
2017/03/14 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
Python使用Pickle库实现读写序列操作示例
2018/06/15 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python+ffmpeg批量去视频开头的方法
2019/01/09 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
python手写均值滤波
2020/02/19 Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
2021/01/12 Python
python实现简单的学生管理系统
2021/02/22 Python
美国卡车、吉普车和SUV零件网站:4 Wheel Parts
2016/11/24 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
Servlet的实例是在生命周期什么时候创建的?配置servlet最重要的是什么?
2012/05/30 面试题
学习十八大的心得体会
2014/09/12 职场文书
用python自动生成日历
2021/04/24 Python
python ansible自动化运维工具执行流程
2021/06/24 Python
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技