Python提取支付宝和微信支付二维码

news/2024/7/3 0:38:37 标签: python, 爬虫, 人工智能

本文首发于我的个人博客,更多 Python 和 django 开发教程,请访问 追梦人物的博客。

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

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

python copyable">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

我分享编程感悟与学习资料的公众号,敬请关注:程序员甜甜圈


http://www.niftyadmin.cn/n/1573804.html

相关文章

如果无法衡量,就无法优化提高

If you cant measure it, you cant improve it! 数据驱动产品决策、精细化运营,的前提是知道如何全方位的衡量自己的现状。 如果不能量化自己,所谓的提升也就无从谈起。

PAT A1030 动态规划

这道题是动态规划几大问题的其中一种,为最长回文子串问题; 动态规划个人来说,觉得最重要的就是建立状态转移方程。对于方程变量,我认为最重要的是有几个构成的关键变量; 对于这道题,我们着手于i~j个字符&am…

决策需要数据,数据需要分析,分析需要决策

生活无时不刻需要决策,决策需要数据来驱动,如何驱动,需要分析来帮忙,然而最具戏剧性的是:分析也是有策略的——分析也需要决策。 例子 举个例子,随着年龄的增长,见识了越来越的年轻人由于不看…

数据 信息 知识 智慧

数据信息知识智慧原始的数字和事实经过处理的数据可发挥作用的信息 反应事物运动状态的原始数字和事实已经排列成有意义的形式的数据已经加工提炼,将很多信息材料的内在联系进行综合分析,从而得出的系统结论激活了的知识,主要表现为收集、加工、应用、传播信息和知识的能力,…

Java排序算法之插入排序

插入排序是简单排序中最快的排序算法,虽然时间复杂度仍然为O(n*n),但是却比冒泡排序和选择排序快很多。 一、原理 1、将指针指向某个元素,假设该元素左侧的元素全部有序,将该元素抽取出来,然后按照从右往左的顺序分别与…

培养数据意识的正确态度

要多与人沟通,不要偏执,在相信数据之前,要有勇气否定自己的一些经验和想法,做到时常关注数据,多思考数据背后的东西。 现在互联网衍生出很多新的玩法和新的事物,已经远超出了我们过去的认知,不要…

Nodejs操作Cassandra数据库

目录 前言安装CassandraNodejs操作Cassandra前言 操作系统win10时间2019年02月Nodejs版本:node v8.9.3Cassandra版本:cassandra-3.11.3参考网址1安装Cassandra 安装Cassandra数据库 官网下载Cassandra压缩包解压,并配置环境变量:操…