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

 更新时间:2019年02月15日 09:07:08   作者:追梦人物的博客  
本文将教你使用 Python 的图像处理库 pillow,轻松批量提取图片中间的方形二维码部分。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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 matplotlib绘图设置图例案例

    Python matplotlib绘图设置图例案例

    这篇文章主要给大家分享Python matplotlib绘图设置图例案例,过程会学到edgecolor 图例边框线颜色 facecolor 图例背景色 shadow 是否添加阴影 title 图例标题 fontsize 设置字体大小,小编觉得挺有意思的,感兴趣的小伙伴也可以参考一下
    2021-12-12
  • 设置jupyter中DataFrame的显示限制方式

    设置jupyter中DataFrame的显示限制方式

    这篇文章主要介绍了设置jupyter中DataFrame的显示限制方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来
    2020-04-04
  • Python中的for循环示例详解

    Python中的for循环示例详解

    Python中的for循环是一种迭代循环,可以迭代容器中的每一个元素,本文通过实例代码给大家介绍Python中的for循环,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Python fileinput模块使用实例

    Python fileinput模块使用实例

    这篇文章主要介绍了Python fileinput模块使用实例,fileinput模块可以遍历文本文件的所有行,本文就给出它的使用代码实例,需要的朋友可以参考下
    2015-05-05
  • python获取系统内存占用信息的实例方法

    python获取系统内存占用信息的实例方法

    在本篇文章里小编给大家整理的是关于python获取系统内存占用信息的实例方法,有需要的朋友们可以参考学习下。
    2020-07-07
  • 详解重置Django migration的常见方式

    详解重置Django migration的常见方式

    这篇文章主要介绍了详解重置Django migration的常见方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • numpy matrix和array的乘和加实例

    numpy matrix和array的乘和加实例

    今天小编就为大家分享一篇numpy matrix和array的乘和加实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 详解python中的文件与目录操作

    详解python中的文件与目录操作

    这篇文章主要介绍了详解python中的文件与目录操作的相关资料,需要的朋友可以参考下
    2017-07-07
  • 15个Pythonic的代码示例(值得收藏)

    15个Pythonic的代码示例(值得收藏)

    这篇文章主要介绍了15个Pythonic的代码示例(值得收藏),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • python实现发送邮件功能

    python实现发送邮件功能

    这篇文章主要为大家详细介绍了python实现发送邮件功能,使用的模块是smtplib、MIMEText,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论