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操作MySQL数据库具体方法
Oct 28 Python
Python 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
Python两个整数相除得到浮点数值的方法
Mar 18 Python
Python内置函数dir详解
Apr 14 Python
python实现数值积分的Simpson方法实例分析
Jun 05 Python
python实现中文转换url编码的方法
Jun 14 Python
用python打印1~20的整数实例讲解
Jul 01 Python
Python2.7:使用Pyhook模块监听鼠标键盘事件-获取坐标实例
Mar 14 Python
pip install 使用国内镜像的方法示例
Apr 03 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 Python
Python自省及反射原理实例详解
Jul 06 Python
python单例模式的应用场景实例讲解
Feb 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
来自PHP.NET的入门教程
2006/10/09 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
yii实现图片上传及缩略图生成的方法
2014/12/04 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
aspx中利用js实现确认删除代码
2010/07/22 Javascript
js中各浏览器中鼠标按键值的差异
2011/04/07 Javascript
幻灯片带网页设计中的20个奇妙应用示例小结
2012/05/27 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
在js文件中写el表达式取不到值的原因及解决方法
2013/12/23 Javascript
JS时间特效最常用的三款
2015/08/19 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
javascript之Boolean类型对象
2016/06/07 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
js实现小窗口拖拽效果
2016/12/03 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
Vue3为什么这么快
2020/09/23 Javascript
python定向爬虫校园论坛帖子信息
2018/07/23 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
体育纪念品、亲笔签名的体育收藏品:Steiner Sports
2020/07/31 全球购物
局域网定义和特性
2016/01/23 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
教育学习自我评价
2014/02/03 职场文书
企业爱岗敬业演讲稿
2014/09/04 职场文书
员工工作能力评语
2014/12/31 职场文书
后天观后感
2015/06/08 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
MySQL视图概念以及相关应用
2022/04/19 MySQL