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搭建HTTP服务器和FTP服务器
Mar 09 Python
python实现识别手写数字 python图像识别算法
Mar 23 Python
python使用RNN实现文本分类
May 24 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
解决python文件双击运行秒退的问题
Jun 24 Python
TensorFlow实现打印每一层的输出
Jan 21 Python
python str字符串转uuid实例
Mar 03 Python
django model object序列化实例
Mar 13 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
python和go语言的区别是什么
Jul 20 Python
django跳转页面传参的实现
Sep 17 Python
Django REST framework 限流功能的使用
Jun 24 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
9个经典的PHP代码片段分享
2014/12/18 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
2016/11/08 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
vue+element表格导出为Excel文件
2019/09/26 Javascript
JS+DIV实现拖动效果
2020/02/11 Javascript
Python中使用动态变量名的方法
2014/05/06 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
python实现猜数游戏
2020/03/27 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
Python selenium模拟手动操作实现无人值守刷积分功能
2020/05/13 Python
基于python 取余问题(%)详解
2020/06/03 Python
Pytest测试框架基本使用方法详解
2020/11/25 Python
WoolOvers爱尔兰:羊绒、羊毛和棉针织品
2017/01/04 全球购物
应届生求职简历的自我评价怎么写
2013/10/23 职场文书
机电一体化自荐信
2013/12/10 职场文书
生物科学系大学生的自我评价
2013/12/20 职场文书
初一生物教学反思
2014/01/18 职场文书
工程开工庆典邀请函
2014/02/01 职场文书
行政助理工作职责范本
2014/03/04 职场文书
教师个人自我评价范文
2014/04/13 职场文书
先进工作者事迹材料
2014/12/23 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书