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关键字and和or用法实例
May 28 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
Python编程实现线性回归和批量梯度下降法代码实例
Jan 04 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
python3转换code128条形码的方法
Apr 17 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Tensorflow 实现释放内存
Feb 03 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
使用python无账号无限制获取企查查信息的实例代码
Apr 17 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 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实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
jQuery示例收集
2010/11/05 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
React快速入门教程
2017/01/17 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
Vue-Cli 3.0 中配置高德地图的两种方式
2019/06/19 Javascript
layui自己添加图片按钮并点击跳转页面的例子
2019/09/14 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
Python中的特殊语法:filter、map、reduce、lambda介绍
2015/04/14 Python
详解常用查找数据结构及算法(Python实现)
2016/12/09 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python中的集合介绍
2019/01/28 Python
彻底理解Python中的yield关键字
2019/04/01 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
用Python进行websocket接口测试
2020/10/16 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
印度在线杂货店:bigbasket
2018/08/23 全球购物
珍爱生命演讲稿
2014/05/10 职场文书
教师演讲稿开场白
2014/08/25 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
个人遵守党的政治纪律情况对照检查材料思想汇报
2014/09/25 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
杜甫草堂导游词
2015/02/03 职场文书
商务信函英语问候语
2015/11/10 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript