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 使用requests模块发送GET和POST请求的实现代码
Sep 21 Python
Python爬虫框架Scrapy实例代码
Mar 04 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Python应用库大全总结
May 30 Python
使用Py2Exe for Python3创建自己的exe程序示例
Oct 31 Python
python后端接收前端回传的文件方法
Jan 02 Python
python模块常用用法实例详解
Oct 17 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
Python 整行读取文本方法并去掉readlines换行\n操作
Sep 03 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
python单元测试之pytest的使用
Jun 07 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 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
php-msf源码详解
2017/12/25 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
PHP之多条件混合筛选功能的实现方法
2019/10/09 PHP
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
javascript提取URL的搜索字符串中的参数(自定义函数实现)
2013/01/22 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
2013/08/21 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
jquery实现简单的自动播放幻灯片效果
2015/06/13 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
Mac下安装vue
2018/04/11 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
详解webpack打包第三方类库的正确姿势
2018/10/20 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
python版微信跳一跳游戏辅助
2018/01/11 Python
python清除字符串前后空格函数的方法
2018/10/21 Python
python实现归并排序算法
2018/11/22 Python
Python功能点实现:函数级/代码块级计时器
2019/01/02 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
2019/06/25 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
2019/08/13 Python
Win10 安装PyCharm2019.1.1(图文教程)
2019/09/29 Python
HTML中fieldset标签概述及使用方法
2013/02/01 HTML / CSS
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
Club Monaco加拿大官网:设计师男女服装
2019/09/29 全球购物
财务会计专业毕业生自荐信
2013/10/19 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书
保卫工作个人总结
2015/03/03 职场文书
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js
Spring 使用注解开发
2022/05/20 Java/Android