Python提取支付宝和微信支付二维码的示例代码
Python  /  管理员 发布于 7年前   210
支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码:
有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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 globfrom PIL import Imageif __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 = ybreak 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 = ybreak 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
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号