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插入数据到列表的方法
Apr 30 Python
python技能之数据导出excel的实例代码
Aug 11 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
Nov 29 Python
python正则表达式面试题解答
Apr 28 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python格式化日期时间操作示例
Jun 28 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
使用qt quick-ListView仿微信好友列表和聊天列表的示例代码
Jun 13 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
探讨php中遍历二维数组的几种方法详解
2013/06/08 PHP
使用PHP备份MYSQL数据的多种方法
2014/01/15 PHP
使用Appcan客户端自动更新PHP版本号(全)
2015/07/31 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
thinkphp3.2实现上传图片的控制器方法
2016/04/28 PHP
php实现学生管理系统
2020/03/21 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
javascript 年月日联动实现核心代码
2009/12/21 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
详解如何实现一个简单的Node.js脚手架
2017/12/04 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
go语言计算两个时间的时间差方法
2015/03/13 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
python如何在终端里面显示一张图片
2016/08/17 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
python迭代器常见用法实例分析
2019/11/22 Python
Python使用eval函数执行动态标表达式过程详解
2020/10/17 Python
高一物理教学反思
2014/01/24 职场文书
优秀团队获奖感言
2014/02/19 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
班主任评语大全
2014/04/26 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
法律意见书范文
2015/06/04 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书