Python提取支付宝和微信支付二维码的示例代码

作者:追梦人物的博客 时间:2021-04-08 19:38:42 

支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码:

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

来源:https://www.zmrenwu.com/post/86/

标签:Python,提取,支付宝,微信,支付二维码
0
投稿

猜你喜欢

  • SQL Server 数据库实用SQL语句

    2024-01-14 00:10:40
  • Python2与python3中 for 循环语句基础与实例分析

    2022-08-12 05:05:01
  • navicat无法远程连接mysql的解决方法

    2024-01-21 13:13:51
  • python判断给定的字符串是否是有效日期的方法

    2023-04-07 20:07:07
  • XSL学习教程:运算符和函数

    2008-01-22 18:24:00
  • 浅谈Javascript中的事件流和事件绑定

    2009-07-20 17:13:00
  • 给大家整理了19个pythonic的编程习惯(小结)

    2024-01-02 08:00:05
  • Python常见字符串操作函数小结【split()、join()、strip()】

    2023-07-21 04:58:15
  • C#连接Oracle数据库的方法

    2024-01-16 20:17:12
  • Python爬虫基础之XPath语法与lxml库的用法详解

    2022-07-03 20:56:06
  • asp 横排显示数据

    2011-03-10 10:50:00
  • Pytorch中torch.stack()函数的深入解析

    2021-06-17 18:39:09
  • html网页调用后端python代码的方法实例

    2023-04-20 19:31:51
  • SQL 判断给定日期值(或时间段)所在星期的星期一和星期天的日期

    2011-10-24 20:14:52
  • flask中响应错误的处理及errorhandler的应用方式

    2021-09-22 08:46:19
  • 使用pyecharts生成Echarts网页的实例

    2023-02-22 10:19:42
  • kali最新国内更新源sources

    2022-03-25 02:53:37
  • tensorflow常用函数API介绍

    2022-10-18 17:49:54
  • python3中编码获取网页的实例方法

    2023-07-17 23:31:47
  • Python格式化输出字符串方法小结【%与format】

    2023-01-06 00:01:50
  • asp之家 网络编程 m.aspxhome.com