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

本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客。

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

9c461fe4f74e05940d679456d911cd22.png

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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 = 0for x in range(width):rgba = pix_data[x, mid_height]if rgba[:3] == (255, 255, 255):x_left = xbreak
​# 确定右边界横坐标: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 = xbreak
​h = x_right - x_left  # 白色背景高度(正方形)mid_height_rgba = pix_data[x_left, mid_height]if filename.endswith('png'):# 微信支付往下确定下边界纵坐标,因为当设置了收款金额时,金额显示在上方y_bottom = mid_heightfor y in range(mid_height, height):rgba = pix_data[x_left, y]if rgba != mid_height_rgba:y_bottom = ybreakbox = (x_left, y_bottom - h, x_right, y_bottom)else:# 支付宝往上确定上边界纵坐标,因为当设置了收款金额时,金额显示在下方y_top = mid_heightfor y in range(mid_height, 0, -1):rgba = pix_data[x_left, y]if rgba != mid_height_rgba:y_top = ybreakbox = (x_left, y_top, x_right, y_top + h)crop = img.crop(box) # box 参数为四元组,分别为左上角和右下角的横纵坐标crop.save('./result/{}'.format(filename))

脚本代码同时上传在 GitHub,使用方法请看 README 文档即可。脚本源码仓库:clip-pay-pic

我分享编程感悟与学习资料的公众号,敬请关注:程序员甜甜圈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java转换流

一般情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。 InputStreamRe…

ARMA模型的平稳性判别(续)

目录 1.特征根判别法 AR(p)模型对应齐次方程特征根与回归系数多项式根的关系: 2.平稳域判别 (1)AR(1)(一阶)模型平稳域 (2)AR(2)(二阶)模型平稳域 3.举例 4.函数展开成幂级数——麦克劳林级数 小结 1.特征根判…

form表单中根据值判断是否disabled_Java 0基础入门 (Html表单、表单元素)

上一篇:Java 0基础入门 (Html标签的使用)表单在网页中主要负责数据采集功能。一.表单实际应用场景百度搜索5173注册如上两张图,图中的黑色线条是我画上去的,如果按照黑线,在Excle中画出这两张表单,相信大家都可以也不是…

ARMA模型性质之平稳AR模型得统计性质

目录 1.均值 Green函数定义 Green函数递推公式 2.方差 举例: 方法1: 方法2: 3.协方差函数 举例1: 举例2: 4.自相关系数 常用的ARA模型自相关系数递推公式: AR模型自相关系数的性质 举例 5.偏自…

Java存储图书信息

使用文件输入/输出流完成存储图书并将图书信息再读取出来的功能。 每到学校开学季都会新进一批图书教材,需要将这些图书信息保存到文件,再将它们打印出来方便老师查看。下面编写程序,使用文件输入/输出流完成图书信息的存储和读取功能&#…

LDA(线性判别分析(普通法))详解 —— python

在这里和大家道个歉,因为我有一篇matlab的LDA和这篇内容大致相同,我就犯懒了,直接复制,没想到公式复制过来全变成了图片,然后造成了,排版有问题,非常难看,真的很抱歉!&am…

wordpress 通过域名无法访问_VPS主机和宝塔面板搭建WordPress网站教程

这是一篇Wordpress建站教程,记录了我在VPS主机上,通过使用宝塔面板,搭建Wordpress网站或个人博客的详细步骤,外贸新人或小白在建立网站的时候可以作为参考。WordPress是全球最流行的建站程序,而且是免费的。用Wordpres…

猜数字小游戏

java代码 猜数字小游戏 程序分析 根据提示输入内容 获取输入的内容 使用for循环进行遍历使用if循坏进行数值的判断 输出结果 完整代码 import java.util.Scanner; import java.util.Random; public class mulTip{public static void main(String[] args){System.out.println…

LDA(线性判别分析(普通法))详解 —— matlab

目录 前言 正题 1.LDA的思想 2. 瑞利商(Rayleigh quotient)与广义瑞利商(genralized Rayleigh quotient) 3. 二类LDA原理 4.多类LDA原理 5.LDA分类 6.LDA算法流程 二类LDA matlab举例: 1.读取数据集 2.分离…

java 异步得到函数返回值_使用JavaScript进行异步编程

毫无疑问,虽然JavaScript的历史比较悠久,但这并不妨碍它成为当今最受欢迎的编程语言之一。对刚接触该语言的人来说,JavaScript的异步特性可能会有一些挑战。在本文中,我们将了解和使用Promise和async/await来编写小型异步程序。通…

Java Collection接口详解

Collection 接口是 List、Set 和 Queue 接口的父接口,通常情况下不被直接使用。Collection 接口定义了一些通用的方法,通过这些方法可以实现对集合的基本操作。定义的方法既可用于操作 Set 集合,也可用于操作 List 和 Queue 集合。 Collecti…

ARMA模型的性质之MA模型

目录 一、MA模型的定义 二、MA模型的统计性质 1.常数均值 2.常数方差 3.自协方差函数q阶结尾 4.自相关系数q阶截尾 举例: 三、MA模型的可逆 1.可逆的定义和条件 2.MA与AR模型的对比 3.逆函数的递推公式 举例: 四、MA模型的偏自相关系数拖尾…

python难度如何_【经验分享】想转行学python,过来人提醒大家几点

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 提醒大家几点 一:盲目的去学 当初我在对于python这个行业什么都不了解的情况下,比如:不知道未来发展趋势,不知道学习python应该注意哪些初始问题,不知道具体的学习规划学…

ArrayList和LinkedList类的用法及区别

List 是一个有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List 集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List 集合默认按元素的添加顺序设置元素的索引,第一个添加到 List 集合中的元素的索引为 0&#xff…

ARMA模型的性质之ARMA模型

目录 一、ARMA模型的定义 二、平稳条件与可逆条件 三、传递形式与逆转形式 四、ARMA(p,q)模型的统计性质 1.均值 2.自协方差函数 3.自相关系数 4.ARMA(p,q)模型自相关系数拖尾,偏自相关系数拖尾 小结 一、ARMA模型的定义 具有如下结构的模型称为自回归移动…

R之Excel文件读取与程序包的安装调用

目录 方法一 方法二 1.用命令安装 2.从下拉菜单安装 三、加载所需安装包 方法一 方法二 四、使用新程序包读取数据 方法一 另存为 .csv 文件 这是wps的另存为 然后选择位置,重命名或更改格式为 .csv 这是excel 的另存为 文件 —— 另存为 —— 选择位置 …

Java遍历Map集合的四种方式

Map 有两组值,因此遍历时可以只遍历值的集合,也可以只遍历键的集合,也可以同时遍历。Map 以及实现 Map 的接口类(如 HashMap、TreeMap、LinkedHashMap、Hashtable 等)都可以用以下几种方式遍历。 1 . 在 for 循环中使…

diag开关什么意思_双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图...

电工学习网:www.diangon.com关注电工学习网官方微信公众号“电工电气学习”,收获更多经验知识。双控开关接线图_一灯双控开关接线图_单联双控开关接线图_双控开关接线图实物图现在市场上面所出售的开关种类非常的多,双控开关正好能够满足人们…

Office 安装MathType7.4 未找到MathPage.wll等问题

目录 问题描述: 解决方法: 问题描述: MathType v7.4 简体中文版是一款功能很强大的数学公式编辑器,在很多地方都会用的,而wps就不能适应各种场合。 但是该软件总会因为不明原因,有时会出现找不到MathType.dll或者MathPage.wll文…

python导入excel加入折线图_利用python向excel文件写数据并绘制折线图

依赖 python 2.7.15 xlswriter(可以使用pip insall xlswriter) 具体实现 #!/usr/bin/env python # -*- coding:utf-8 -*- import xlsxwriter # Create a workbook and add a worksheet. workbook xlsxwriter.Workbook(Expenses01.xlsx) worksheet work…