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

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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提取支付宝和微信支付二维码的示例代码相关推荐

  1. python 二维码_Python提取支付宝和微信支付二维码

    本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客. 支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二 ...

  2. python制作微信二维码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  3. python表格绘制斜线表头_Python之ReportLab绘制条形码和二维码

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  4. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...

    下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本.本文将教你使用 Pytho ...

  5. python zxing 识别条码_Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系 ...

  6. python发票二维码条码识别_Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...

  7. PHP微信动态二维码活码管理系统源码免授权 独立版 带充值支付

    简介: 免授权 独立版 带充值支付 微信群满100人以后,就不能扫描二维码入群了怎么办? 用活码就能完美解决这个问题. 使用微信群活码工具,二维码永不过期,不受100人限制,对外统一宣传一个固定的二维 ...

  8. 前端怎么从H5调起微信扫描二维码?小程序使用扫码功能.

    小程序如何使用扫码的功能呢? wx.scanCode(Object object) 参数 属性 类型 默认值 必填 说明 最低版本 onlyFromCamera boolean false 否 是否只 ...

  9. JAVA实现的微信扫描二维码支付

    支付项目采用springMvc+Dubbo架构实现,只对外提供接口. 话说,为什么微信支付比支付宝来的晚了那么一点,一句话,那一阵挺忙的,然后就没有时间整理,最近做完支付宝支付,顺便也把微信支付的也整 ...

最新文章

  1. 用户开始接纳虚拟化双厂商策略
  2. Uri编码,包括javascript前端与C#服务器端
  3. python如何判断字典中是否存在某个键_总结:11个Python3字典内置方法大全及示例...
  4. C# 9 record 并非简单属性 POCO 的语法糖
  5. LeetCode-116. 填充每个节点的下一个右侧节点指针
  6. 40Linux组41Linux所有者42Linux所在组43Linux修改所有组
  7. YOLOv3网络结构
  8. 计算机网络实验之局域网应用,计算机网络实验之局域网的配置
  9. 「Photoshop 入门教程」如何在Mac版 Photoshop 中打开图像?
  10. awk学习笔记(16) - 字符串函数
  11. android反编译修改教程,Android逆向反编译代码注入
  12. 一朵花的组成结构图_请问一朵完整的花由哪几部分组成
  13. Codeforces 802 补题
  14. 模拟ATM机存取款管理系统设计(C++)
  15. Compression-Expansion Coding Improvements in MLC/TLC NVM论文解读
  16. 大学计算机实验报告虚拟机,1虚拟机安装和使用实验报告书
  17. activiti学习资料--initiator的作用及其使用
  18. python依次输入输出字符串_Python练习:输入一个字符串并输出该字符串中所有字符的组合,python...
  19. OpenWrt之IPTV单线复用详细教程
  20. Linux usb设备驱动(2)--- usbmouse.c 源码分析

热门文章

  1. 详细讲解二极管的钳位电路和限幅电路
  2. 使用C/C++的#include命令(文件包含命令)时,文件名用尖括号或双撇号(双引号)括起来的区别
  3. php fpm工作原理,phpfpm工作原理是什么?
  4. oracle rfs进程过多,Oracle物理备库RFS进程消失,不能启动--解决
  5. 埃里克贝里奇_未来公司客服的标配?苹果Watch智能手表开启新时代
  6. 求集合中的非空子集 Java
  7. selenium+云打码+百度ocr爬取360的电话号码标记
  8. 蒲公英 · 积跬步以至千里
  9. Linux系统命令(网络通信)
  10. MyEclipse清除已永久保存的SVN账号