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正则分组的应用
Nov 10 Python
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python实现股市信息下载的方法
Jun 15 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
Python 异常处理的实例详解
Sep 11 Python
Django基础三之视图函数的使用方法
Jul 18 Python
Series和DataFrame使用简单入门
Nov 13 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
May 04 Python
解决python 虚拟环境删除包无法加载的问题
Jul 13 Python
Python requests接口测试实现代码
Sep 08 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开发入门教程之面向对象
2006/12/05 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
PHP扩展模块Pecl、Pear以及Perl的区别
2014/04/09 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
Zend Framework缓存Cache用法简单实例
2016/03/19 PHP
前台js调用后台方法示例
2013/12/02 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
jquery利用json实现页面之间传值的实例解析
2016/12/12 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
vue2.x集成百度UEditor富文本编辑器的方法
2018/09/21 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
python监控文件并且发送告警邮件
2018/06/21 Python
python实现简易动态时钟
2018/11/19 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
python日期相关操作实例小结
2019/06/24 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
介绍一下RMI的基本概念
2016/12/17 面试题
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
班组长岗位职责范本
2014/01/05 职场文书
英语求职信范文
2014/05/23 职场文书
村班子对照检查材料
2014/08/18 职场文书
财务会计实训报告
2014/11/05 职场文书
师德师风学习材料
2014/12/19 职场文书
golang定时器
2022/04/14 Golang