学做网站游戏教程,wordpress网站怎么进入,怎样做平台销售,微信公众号创建需要多少钱本文首发于我的个人博客#xff0c;更多 Python 和 django 开发教程#xff0c;请访问 追梦人物的博客。支付宝或者微信支付导出的收款二维码#xff0c;除了二维码部分#xff0c;还有很大一块背景图案#xff0c;例如下面就是微信支付的收款二维码#xff1a;有时候我们…本文首发于我的个人博客更多 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_toph)、(x_left, y_toph)。代码实现有了上述思路我们就可以轻松写出 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 0for x in range(width):rgba pix_data[x, mid_height]if rgba[:3] (255, 255, 255):x_left xbreak
# 确定右边界横坐标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 xbreak
h x_right - x_left # 白色背景高度正方形mid_height_rgba pix_data[x_left, mid_height]if filename.endswith(png):# 微信支付往下确定下边界纵坐标因为当设置了收款金额时金额显示在上方y_bottom mid_heightfor y in range(mid_height, height):rgba pix_data[x_left, y]if rgba ! mid_height_rgba:y_bottom ybreakbox (x_left, y_bottom - h, x_right, y_bottom)else:# 支付宝往上确定上边界纵坐标因为当设置了收款金额时金额显示在下方y_top mid_heightfor y in range(mid_height, 0, -1):rgba pix_data[x_left, y]if rgba ! mid_height_rgba:y_top ybreakbox (x_left, y_top, x_right, y_top h)crop img.crop(box) # box 参数为四元组分别为左上角和右下角的横纵坐标crop.save(./result/{}.format(filename))脚本代码同时上传在 GitHub使用方法请看 README 文档即可。脚本源码仓库clip-pay-pic我分享编程感悟与学习资料的公众号敬请关注程序员甜甜圈