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

  

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

  

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

  

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用Python的图像处理库枕头,轻松批量提取图片中间的方形二维码部分。

  

  

以微信支付收款码图片为例:

  

分析图片我们可以看的到,二维码位于白色背景中,而白色背景又位于绿色背景上。我们以图片左上角为坐标原点,横向为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值的变化(即颜色的变化)确定待裁剪边界即可。

        进口一滴   从公益诉讼导入图像      if __name__==癬_main__”:   文件名=glob.glob (* . png) #微信支付收款码导出为png格式   filenames.extend (glob.glob (* . jpg)) #支付宝收款码导出为jpg格式      文件名的文件名:   img Image.open(文件名):   img.convert (“RGBA”)   pix_data=https://www.yisu.com/zixun/img.load ()      #图片左上角为原点,横向为x轴(向右为正方向),纵向为y轴(向下为正方向)   宽度,高度=img。大小#图片宽和高   mid_height=身高//2 #图片正中纵坐标      #确定左边界横坐标:   x_left=0   x的范围(宽度):   rgba=pix_data [x, mid_height]   如果rgba (: 3)==(255、255、255):   x_left=x   打破      #确定右边界横坐标:   x_right=宽度- 1 #右边界   x的范围(宽度- 1,0,1):   rgba=pix_data [x, mid_height]   如果rgba (: 3)==(255、255、255):   x_right=x   打破      h=x_right - x_left #白色背景高度(正方形)   mid_height_rgba=pix_data [x_left mid_height]   如果filename.endswith (png):   #微信支付往下确定下边界纵坐标,因为当设置了收款金额时,金额显示在上方   y_bottom=mid_height   y的范围(mid_height、高度):   rgba=pix_data [x_left y]   如果rgba !=mid_height_rgba:   y_bottom=y   打破   盒=(x_left y_bottom - h, x_right y_bottom)   其他:   #支付宝往上确定上边界纵坐标,因为当设置了收款金额时,金额显示在下方   y_top=mid_height   y的范围(mid_height 0 1):   rgba=pix_data [x_left y]   如果rgba !=mid_height_rgba:   y_top=y   打破   盒=(x_left y_top、x_right y_top + h)   作物=img.crop(箱)#箱参数为四元组,分别为左上角和右下角的横纵坐标   crop.save('。/结果/{}' .format(文件名))      

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

  

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