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 实现tar文件压缩解压的实例详解
Aug 20 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
使用TensorFlow实现二分类的方法示例
Feb 05 Python
Python生成器的使用方法和示例代码
Mar 04 Python
python将字符串转换成json的方法小结
Jul 09 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
pycharm远程连接服务器并配置python interpreter的方法
Dec 23 Python
如何用python开发Zeroc Ice应用
Jan 29 Python
Django项目如何获得SSL证书与配置HTTPS
Apr 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颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
2013/09/23 PHP
php程序内部post数据的方法
2015/03/31 PHP
基于thinkPHP框架实现留言板的方法
2016/10/17 PHP
使用composer命令加载vendor中的第三方类库 的方法
2019/07/09 PHP
JavaScript 学习笔记(九)call和apply方法
2010/01/11 Javascript
jquery iframe操作详细解析
2013/11/20 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
详解javascript中的事件处理
2015/11/06 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
js逆向解密之网络爬虫
2019/05/30 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
vue 将多个过滤器封装到一个文件中的代码详解
2020/09/05 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
Python简单实现两个任意字符串乘积的方法示例
2018/04/12 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
python列表,字典,元组简单用法示例
2019/07/11 Python
scrapy框架携带cookie访问淘宝购物车功能的实现代码
2020/07/07 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
HTML5制作表格样式
2016/11/15 HTML / CSS
详解HTML5之pushstate、popstate操作history,无刷新改变当前url
2017/03/15 HTML / CSS
校园文明倡议书
2014/05/16 职场文书
药店促销活动总结
2014/07/10 职场文书
拾金不昧感谢信
2015/01/21 职场文书
对公司的意见和建议
2015/06/04 职场文书
个人收入证明范本
2015/06/12 职场文书
2016继续教育研修日志
2015/11/13 职场文书
html form表单基础入门案例讲解
2021/07/21 HTML / CSS