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

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

本文标题: Python提取支付宝和微信支付二维码的示例代码

本文地址: http://www.cppcns.com/jiaoben/python/252220.html

python制作微信二维码_Python提取支付宝和微信支付二维码的示例代码相关推荐

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

    本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客. 支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二 ...

  2. python支付程序源码_Python提取支付宝和微信支付二维码的示例代码

    支付宝或者微信支付导出的收款二维码,除了二维码部分,还有很大一块背景图案,例如下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件 ...

  3. 一张收款码,同时支持微信、云闪付、支付宝、信用卡支付

    想必你也有过这样的经历,在门店消费时,看过商家只张贴了一张收款码,用微信或者支付宝扫码都可以支付,同时支持微信.云闪付.支付宝.信用卡支付. 这样不管是对商家还是顾客来说确实都更加方便快捷.商家只需要 ...

  4. wx超强随机短视频程序源码视频打赏自带视频+支付接口+源码自适应/安装教程

    demo软件园每日更新资源,请看到最后就能获取你想要的: 1.wx超强随机短视频程序源码视频打赏自带视频+支付接口+源码自适应/安装教程 可以放wx号.点击+微信按钮时,自动++wx号并打开微信软件 ...

  5. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...

    下面就是微信支付的收款二维码: 有时候我们仅仅只想要图片中间的方形二维码部分,为了提取出中间部分,我们可以使用图片处理软件,但图片处理软件不利于批处理,且学习也需要一定成本.本文将教你使用 Pytho ...

  6. python write非法字符报错_Python爬虫实现的微信公众号文章下载器

    平时爱逛知乎,收藏了不少别人推荐的数据分析.机器学习相关的微信公众号(这里就不列举了,以免硬广嫌疑).但是在手机微信上一页页的翻阅历史文章浏览,很不方便,电脑端微信也不方便. 所以我就想有什么方法能否 ...

  7. python获取视频帧的时间_Python提取视频中图片的示例(按帧、按秒)

    一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'D:\\test\\' ...

  8. pythonjson构建二维数组_python后台获取ajax传递的二维数组,保持原有数据结构不变...

    python后台获取ajax传递的二维数组,保持原有数据结构不变. 前台主要程序: arr_data = [[1,2,3],[4,5,6]];//创建二维数组 var json_data = JSON ...

  9. python做视频抽帧图_Python提取视频中图片的示例(按帧、按秒)

    一.按帧提取 #coding=utf-8 import os import cv2 def save_img(): #提取视频中图片 按照每帧提取 video_path = r'd:\\test\\' ...

最新文章

  1. python设计问答器_Python文件包装器,最佳设计?
  2. python中的json_简单介绍Python中的JSON使用
  3. MVC5中EF6 Code First启动慢及间隙变慢的一些优化处理
  4. jquery刷新页面
  5. 信息学奥赛一本通 1013:温度表达转化 | OpenJudge NOI 1.3 08
  6. 彩虹云任务极致精简版--PHPcron程序
  7. c语言表达式1 33的值是,2015年计算机二级C语言测试题及答案(1)
  8. wireshark学习使用
  9. deap dataset的不同分类模型的实现(1)
  10. 嵌入式课程 之 超声波传感器实验
  11. 【UVM基础】3、核心基类和机制
  12. mysql config.xml_generatorConfig-mysql.xml中连接数据库的正确书写方式。
  13. java 微信多线程推送_Java实现 微信小程序 + 消息推送
  14. 深入理解Java虚拟机(10-13)学习总结
  15. java调第三方接口
  16. Refactor this method to reduce its Cognitive Complexity from 65 to the 15 allowed. [+22 locations]
  17. 短信生成器部分思路----Android
  18. sqlserver根据经纬度查询距离范围
  19. 保险项目核保的规则和所负责业务的逻辑【杭州多测师】【杭州多测师_王sir】...
  20. Lambert(兰勃托)投影--我国天气图底图广泛采用的一种投影

热门文章

  1. 微信公众号之验证JS-SDK
  2. 【QGIS基础操作】QGIS插件功能记录
  3. 软著申请具体需要哪些步骤呢?
  4. 开源分布式量化交易系统——回测系统(一)
  5. 微型计算机中bus是指,微机中的bus一词是指什么
  6. Qt开发-QT Quick
  7. 给开发人员的时间管理建议
  8. w3c易语言教程,易语言基础教程之简单的人机交互
  9. Coremail保障企业邮箱安全!《数安法》《关基保护条例》正式施行!
  10. 天下最不能等待的事情莫过于孝敬自己的父母![转载]