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中用Ctrl+C终止多线程程序的问题解决
Mar 30 Python
Python实现使用卷积提取图片轮廓功能示例
May 12 Python
浅析Python pandas模块输出每行中间省略号问题
Jul 03 Python
代码详解django中数据库设置
Jan 28 Python
python3人脸识别的两种方法
Apr 25 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
python 6行代码制作月历生成器
Sep 18 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
python opencv通过按键采集图片源码
May 20 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中var_dump方法的使用详解
2013/06/24 PHP
php常用文件操作函数汇总
2014/11/22 PHP
PHP实现阳历到农历转换的类实例
2015/03/07 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
鼠标事件延时切换插件
2011/03/12 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
jQuery获取上传文件的名称的正则表达式
2015/05/21 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
2016/05/19 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
在Pycharm terminal中字体大小设置的方法
2019/01/16 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
匡威德国官网:Converse德国
2019/01/26 全球购物
学生会竞选演讲稿
2014/04/24 职场文书
煤矿安全协议书
2014/08/20 职场文书
2015年妇幼保健工作总结
2015/05/19 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js