当前位置:脚本大全 > > 正文

python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)

时间:2022-03-28 13:34:19类别:脚本大全

python微信支付接口

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

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

python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)

有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本。本文将教你使用 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 值的变化(即颜色的变化)确定待裁剪边界即可。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • import glob
  • from pil import image
  •  
  • if __name__ == '__main__':
  •   filenames = glob.glob('*.jpg" alt="python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)" border="0" />) # 微信支付收款码导出为.jpg" alt="python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)" border="0" />
  •   filenames.extend(glob.glob('*.jpg" alt="python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)" border="0" />)) # 支付宝收款码导出为.jpg" alt="python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)" border="0" />
  •  
  •   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('.jpg" alt="python微信支付接口(Python提取支付宝和微信支付二维码的示例代码)" border="0" />):
  •         # 微信支付往下确定下边界纵坐标,因为当设置了收款金额时,金额显示在上方
  •         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/

    上一篇下一篇

    猜您喜欢

    热门推荐