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抢过年的火车票附源码
Dec 07 Python
python魔法方法-自定义序列详解
Jul 21 Python
使用Python脚本和ADB命令实现卸载App
Feb 10 Python
EM算法的python实现的方法步骤
Jan 02 Python
python+pyqt5实现24点小游戏
Jan 24 Python
python 计算平均平方误差(MSE)的实例
Jun 29 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
Oct 10 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
Python3交互式shell ipython3安装及使用详解
Jul 11 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
Python实战之大鱼吃小鱼游戏的实现
Apr 01 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中使用$_REQUEST需要注意的一个问题
2013/05/02 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
简单的代码实现jquery定时器
2014/01/03 Javascript
如何在MVC应用程序中使用Jquery
2014/11/17 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
Javascript中常见的逻辑题和解决方法
2016/09/17 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
JS实现JSON.stringify的实例代码讲解
2017/02/07 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
python dumps和loads区别详解
2020/02/04 Python
Python Dataframe常见索引方式详解
2020/05/27 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
Docker如何部署Python项目的实现详解
2020/10/26 Python
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
教师自荐信范文
2013/12/09 职场文书
老干部工作先进事迹
2014/08/17 职场文书
2014年体检中心工作总结
2014/12/23 职场文书
冰峪沟导游词
2015/02/09 职场文书
老员工辞职信范文
2015/05/12 职场文书
尼克胡哲观后感
2015/06/08 职场文书
同乡会致辞
2015/07/30 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书