Python提取支付宝和微信支付二维码的示例代码
作者:追梦人物的博客 发布时间:2021-04-08 19:38:42
支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码:
有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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/
猜你喜欢
- 该域名查询系统写的很简单,只是实现了功能使用XmlHttp来获取远程查询结果,实际上就是小偷程序!相关推荐:域名注册情况查询/
- 为数据库配置比较大的内存,可以有效提高数据库性能。因为数据库在运行过程中,会在内存中划出一块区域来作为数据缓存。通常情况下,用户访问数据库时
- 采用双重循环。把图片进行“.”分割后名字问前面部分,那其余数据库中的 图片路径记录进行对比 采用vb的InStr函数 如果存在的话返回值&g
- 我其实是同一天看到Robert Treat几人整理的”Mysql 迁移到Oracle前需要了解的50件事“与Baron Schwartz的”
- 从CNNIC在2009年的报告中可以看到,超过80%的网民购物之前都要看评论(包括本站、其他站评论),超过80%的网民都比较信任口碑(包括网
- 现在流行虚拟主机建站,我也有个网站,也算是个站长咯。当了近一年的站长,感到网站程序每次升级的时候颇为麻烦:先去官方看公告,然后下载升级包到本
- 本文实例讲述了jQuery+php简单实现全选删除的方法。分享给大家供大家参考,具体如下:<input type="chec
- 1,FCKeditor 编辑器最新版本: 2.3.1站点:http://www.fckeditor.net 演示:http://w
- 本文主要给大家介绍了关于Python中getpass模块的相关内容,分享出来供大家参考学习,话不多说了,来一起看看详细的介绍:getpass
- 本人非计算机,亦非心理学,或者交互设计,更非设计专业出身,因此什么都是半桶水。即使如此,依然靠着兴趣寻找乐趣。对于设计,爱之,但没有受过系统
- class test { &nbs
- 用比较笨的方法来做abc ="AlkjA;lkjlkjAlkAkjAlkjAAAA" if instr(abc,&quo
- 在向大家详细介绍Linux mysql之前,首先让大家了解下Linux mysql,然后全面介绍Linux mysql,希望对大家有用。1.
- array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组。 当几个数组元素的值相等时
- 合理地扩大页面链接响应区域可以提高网页的易用性。同时还要兼顾到链接的交互一致性以及视觉上的平衡,就需要做一些特殊的处理。实例一:一张图配一个
- Apache2 httpd.conf 中文版 # # 基于 NCSA 服务的配
- 今天学习php,当然是要先安装好运行环境了,phpstyudy是一个运行php的集成环境, 一键安装对新手很友好,与时作为一个新手,便跟着教
- 对于一个内容页的文章来说,如果这个文章内容过长或是其中有分类(排行),那么进行分页阅读无疑是最好的选择。如果一个文章内容不涉及分类,比如小说
- 整本书围绕着一个叫做“CSS禅意花园”的网站展开,其实N久之前我在一份外国的关于CSS的在线教程上看到了这个网站的链接,可惜进去之后发现内容
- 调用数据库存储过程见下:<%Set Dataconn = Server.CreateObject(&qu