python-docx插入OpenCV处理图片报AttributeError: 'NoneType'无seek属性
问题原因
该报错由两个叠加的错误触发:
numpy.ndarray.resize()是原位修改数组维度的方法,没有返回值,你赋值得到的resized_image实际为None,python-docx的add_picture方法接收None后尝试调用seek读取内容就会触发该报错add_picture方法本身不支持直接传入OpenCV读取得到的numpy数组格式,仅支持本地文件路径、字节流、PIL Image对象三类输入
修复步骤
- 替换numpy数组的resize调用为
cv2.resize()方法,正确得到调整尺寸后的图像数组 - 调整后的OpenCV数组转换为PIL Image对象,再传入
add_picture方法 - 修正原代码中逻辑分支判断的错误,原判断条件覆盖不全,横版、竖版图像的判断逻辑写反
修复后完整代码
from docx import Document import cv2 from PIL import Image import glob import os from io import BytesIO document = Document() img_dir = "C:/Users/27832/Desktop/Report Images" data_path = os.path.join(img_dir,'*g') files = glob.glob(data_path) for pic in files: # 跳过读取失败的无效文件 if not os.path.exists(pic): continue imagg = cv2.imread(pic) if imagg is None: continue # cv2默认BGR格式,转成PIL需要的RGB格式 imagg = cv2.cvtColor(imagg, cv2.COLOR_BGR2RGB) h, w = imagg.shape[:2] aspect_ratio = w / h # 按宽高比调整尺寸 if 0.85 < aspect_ratio < 1.15: # 近似正方形 resized = cv2.resize(imagg, (314, 314)) elif aspect_ratio >= 1.15: # 横版图片 resized = cv2.resize(imagg, (401, 325)) else: # 竖版图片 resized = cv2.resize(imagg, (257, 382)) # 转成字节流传入docx,无需临时存储本地文件 pil_img = Image.fromarray(resized) img_stream = BytesIO() pil_img.save(img_stream, format='PNG') img_stream.seek(0) document.add_picture(img_stream) # 自动创建目标保存目录 save_dir = "C:/Users/27832/Desktop/Word Macro Program" if not os.path.exists(save_dir): os.makedirs(save_dir) document.save(os.path.join(save_dir, "Report.docx"))
内容的提问来源于stack exchange,提问作者Charles Goldman
相关产品推荐
相关产品推荐

