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 相关文章推荐
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
Python读写docx文件的方法
May 08 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
Python实现随机生成任意数量车牌号
Jan 21 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
Django自带的用户验证系统实现
Dec 18 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
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php限制文件下载速度的代码
2015/10/20 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
封装了一个js图片轮换效果的函数
2011/09/28 Javascript
基于jQuery的模仿新浪微博时间的组件
2011/10/04 Javascript
jQuery层次选择器选择元素使用介绍
2013/04/18 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
简单理解js的冒泡排序
2016/12/19 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
微信小程序云开发修改云数据库中的数据方法
2019/05/18 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
关于vue的列表图片选中打钩操作
2020/09/09 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
Python库urllib与urllib2主要区别分析
2014/07/13 Python
python学习数据结构实例代码
2015/05/11 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
python实现批量转换图片为黑白
2020/06/16 Python
使用HTML5 IndexDB存储图像和文件的示例
2018/11/05 HTML / CSS
趣味运动会活动方案
2014/02/12 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
大学生实训报告总结
2014/11/05 职场文书
教师个人培训总结
2015/02/11 职场文书
金陵十三钗观后感
2015/06/04 职场文书
vue自定义右键菜单之全局实现
2022/04/09 Vue.js
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript