使用askopenfilename插入图片时遇AttributeError: numpy.ndarray无paste属性问题
解决
AttributeError: 'numpy.ndarray' object has no attribute 'paste'问题 这个问题我之前也碰到过!核心原因很简单——你现在通过askopenfilename选完图后,应该是用cv2.imread()读取了图片,得到的是numpy.ndarray对象,而paste()是PIL Image类独有的方法,两者不是同一个类型的对象,自然会抛出这个错误。而你之前直接用Image.open()打开本地文件时,得到的是PIL的Image实例,所以能正常调用paste()。
下面给你两种可行的解决方案:
方案1:全程用PIL处理图片(最直接)
放弃用cv2读取,统一用PIL的Image.open()来加载通过对话框选中的图片,这样得到的都是Image实例,就能正常使用paste()方法:
from PIL import Image from tkinter.filedialog import askopenfilename # Python3环境用这个,Python2用tkFileDialog # 选择背景图 bg_filepath = askopenfilename(filetypes=[("image","*.png")]) background = Image.open(bg_filepath) # 选择要插入的logo图 img_filepath = askopenfilename(filetypes=[("image","*.png")]) img = Image.open(img_filepath) # 设置图片插入的偏移位置(比如从左上角往右、往下各50像素) offset = (50, 50) # 执行粘贴操作 background.paste(img, offset) # 保存结果或直接显示 background.save("final_result.png") background.show()
方案2:如果必须保留cv2的处理逻辑
如果你因为其他需求必须用cv2读取图片,那需要把cv2得到的numpy数组转换成PIL Image对象,处理完后还可以再转回cv2格式:
import cv2 from PIL import Image import numpy as np from tkinter.filedialog import askopenfilename # 读取背景图并转成PIL Image bg_filepath = askopenfilename(filetypes=[("image","*.png")]) bg_cv = cv2.imread(bg_filepath) # cv2默认读取的是BGR格式,要转成RGB才能和PIL兼容 bg_rgb = cv2.cvtColor(bg_cv, cv2.COLOR_BGR2RGB) background = Image.fromarray(bg_rgb) # 读取插入图并转成PIL Image img_filepath = askopenfilename(filetypes=[("image","*.png")]) img_cv = cv2.imread(img_filepath) img_rgb = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB) img = Image.fromarray(img_rgb) # 执行粘贴 offset = (50, 50) background.paste(img, offset) # 可选:如果需要再转回cv2格式处理 result_cv = cv2.cvtColor(np.array(background), cv2.COLOR_RGB2BGR) cv2.imwrite("result_with_cv2.png", result_cv)
额外注意点
如果你的插入图是带透明通道的PNG(RGBA格式),直接用paste()会让透明区域变成黑色,这时候需要传入mask参数:
background.paste(img, offset, img) # 第三个参数传入img本身作为遮罩
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

