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 相关文章推荐
Python书单 不将就
Jul 11 Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 Python
python模仿网页版微信发送消息功能
Feb 24 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
详解python如何在django中为用户模型添加自定义权限
Oct 15 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
django重新生成数据库中的某张表方法
Aug 28 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
python关于集合的知识案例详解
May 30 Python
python缺失值的解决方法总结
Jun 09 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
把从SQL中取出的数据转化成XMl格式
2006/10/09 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
WordPress网站性能优化指南
2015/11/18 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
Jquery uploadify上传插件使用详解
2016/01/13 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
vue axios封装及API统一管理的方法
2019/04/18 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
Python实现列表删除重复元素的三种常用方法分析
2017/11/24 Python
python的unittest测试类代码实例
2017/12/07 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
pandas数据拼接的实现示例
2020/04/16 Python
html5 标签
2009/07/16 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
德尔福集团DELPHI的笔试题
2012/02/22 面试题
上班离岗检讨书
2014/01/27 职场文书
我爱我家教学反思
2014/05/01 职场文书
2014年文秘工作总结
2014/11/25 职场文书
考博导师推荐信范文
2015/03/27 职场文书
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
Golang 遍历二叉树
2022/04/19 Golang