Python提取支付宝和微信支付二维码的示例代码


Posted in Python onFebruary 15, 2019

支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码:

Python提取支付宝和微信支付二维码的示例代码

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 Python 的图像处理库 pillow,轻松批量提取图片中间的方形二维码部分。

提取思路

以微信支付收款码图片为例:

分析图片我们可以看到,二维码位于白色背景中,而白色背景又位于绿色背景上。我们以图片左上角为坐标原点,横向为 x 轴(向右为正方向),纵向为 y 轴(向下为正方向)。我们的目标是需要确定白色背景部分 4 个角的坐标。

从图片左边正中向右横向穿过,当背景色从绿色变为白色时,该点所在位置的横坐标即为左上角和左下角的横坐标,记为 x_left。

同理从图片右边正中向左横向穿过,当背景色从绿色变为白色时,该点所在位置的横坐标即为右上角和右下角的横坐标,记为 x_right。

则白色背景宽度和高度为 h = x_right - x_left。

再从绿色背景转为白色背景时的点向上(或者向下,此处以向上为例)出发,当背景色从白色又变为绿色时,该点所在位置的纵坐标即为左上角和右上角的纵坐标,记为 y_top。

则可以计算出左下角和右下角的纵坐标为 (y_top + h)。

由此,白色背景部分 4 个角的坐标均确定,分别为(从左上角开始顺时针):(x_left, y_top)、(x_right, y_top)、(x_right, y_top+h)、(x_left, y_top+h)。

代码实现

有了上述思路,我们就可以轻松写出 Python 脚本了。代码中给出了详细注释,其基本思路就是导入图片,将其转为一个二维矩阵,矩阵的元素为图片对应像素点的 RGBA 值,然后根据 RGBA 值的变化(即颜色的变化)确定待裁剪边界即可。

import glob
from PIL import Image

if __name__ == '__main__':
  filenames = glob.glob('*.png') # 微信支付收款码导出为 png 格式
  filenames.extend(glob.glob('*.jpg')) # 支付宝收款码导出为 jpg 格式

  for filename in filenames:
    with Image.open(filename) as img:
      img.convert('RGBA')
      pix_data = img.load()

      # 图片左上角为原点,横向为 x 轴(向右为正方向),纵向为 y 轴(向下为正方向)
      width, height = img.size # 图片宽和高
      mid_height = height // 2 # 图片正中纵坐标

      # 确定左边界横坐标:
      x_left = 0
      for x in range(width):
        rgba = pix_data[x, mid_height]
        if rgba[:3] == (255, 255, 255):
          x_left = x
          break

      # 确定右边界横坐标:
      x_right = width - 1 # 右边界
      for x in range(width - 1, 0, -1):
        rgba = pix_data[x, mid_height]
        if rgba[:3] == (255, 255, 255):
          x_right = x
          break

      h = x_right - x_left # 白色背景高度(正方形)
      mid_height_rgba = pix_data[x_left, mid_height]
      if filename.endswith('png'):
        # 微信支付往下确定下边界纵坐标,因为当设置了收款金额时,金额显示在上方
        y_bottom = mid_height
        for y in range(mid_height, height):
          rgba = pix_data[x_left, y]
          if rgba != mid_height_rgba:
            y_bottom = y
            break
        box = (x_left, y_bottom - h, x_right, y_bottom)
      else:
        # 支付宝往上确定上边界纵坐标,因为当设置了收款金额时,金额显示在下方
        y_top = mid_height
        for y in range(mid_height, 0, -1):
          rgba = pix_data[x_left, y]
          if rgba != mid_height_rgba:
            y_top = y
            break
        box = (x_left, y_top, x_right, y_top + h)
      crop = img.crop(box) # box 参数为四元组,分别为左上角和右下角的横纵坐标
      crop.save('./result/{}'.format(filename))

脚本代码同时上传在 GitHub,使用方法请看 README 文档即可。脚本源码仓库:clip-pay-pic

Python 相关文章推荐
简单的Apache+FastCGI+Django配置指南
Jul 22 Python
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
详解Python Socket网络编程
Jan 05 Python
用Python写一个无界面的2048小游戏
May 24 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
查看Django和flask版本的方法
May 14 Python
python 获取当天凌晨零点的时间戳方法
May 22 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
浅谈Python反射 & 单例模式
Mar 21 Python
用Python写一个简易版弹球游戏
Apr 13 Python
pytorch训练神经网络爆内存的解决方案
May 22 Python
浅谈Python从全局与局部变量到装饰器的相关知识
Jun 21 Python
Python实现的IP端口扫描工具类示例
Feb 15 #Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 #Python
Python从文件中读取数据的方法讲解
Feb 14 #Python
python爬取cnvd漏洞库信息的实例
Feb 14 #Python
基于python历史天气采集的分析
Feb 14 #Python
Python 实现域名解析为ip的方法
Feb 14 #Python
解决python Markdown模块乱码的问题
Feb 14 #Python
You might like
PHP include_path设置技巧分享
2011/07/03 PHP
php使用ob_flush不能每隔一秒输出原理分析
2015/06/02 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
JavaScript 通过模式匹配实现重载
2010/08/12 Javascript
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
JS组件系列之使用HTML标签的data属性初始化JS组件
2016/09/14 Javascript
JS 获取HTML标签内的子节点的方法
2016/09/21 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
JS实现数组去重方法总结(六种方法)
2017/07/14 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
微信小程序实现时间进度条功能
2020/11/17 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
Python中的包和模块实例
2014/11/22 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
PyTorch的深度学习入门教程之构建神经网络
2019/06/27 Python
Python各种扩展名区别点整理
2020/02/27 Python
经典的班主任推荐信
2013/10/28 职场文书
自动化专业个人求职信范文
2013/12/30 职场文书
土木工程专业个人求职信
2013/12/30 职场文书
兼职业务员岗位职责
2014/01/01 职场文书
法院信息化建设方案
2014/05/21 职场文书
中秋节活动总结
2014/08/29 职场文书
党员作风建设整改方案
2014/10/27 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
十佳少年事迹材料
2014/12/25 职场文书