如何不保存本地文件直接将PIL Image传入Google Cloud Vision
解决方案
问题根因
使用BytesIO内存缓存方案时报错的核心原因是构造vision.Image实例时未显式指定content关键字参数。Google Cloud Vision Python客户端基于ProtoBuf实现,构造器不接受直接传入位置参数作为图片内容,必须显式声明content=。
正确实现代码
from PIL import Image from io import BytesIO from google.cloud import vision # 读取本地图片并裁剪指定区域 image = Image.open(path).convert('RGB') cropped_image = image.crop((30, 900, 510, 1200)) # 将裁剪后的PIL图片写入内存缓冲区,无需落地到磁盘 buffer = BytesIO() cropped_image.save(buffer, format='PNG') # 显式指定content参数传入内存中的图片字节流 vision_image = vision.Image(content=buffer.getvalue()) # 调用文本检测API client = vision.ImageAnnotatorClient() response = client.text_detection(image=vision_image)
额外说明
你测试过程中观察到两种字节流内容存在差异属于正常现象:本地读取的是原PNG文件的原始编码结果,PIL重新保存到内存缓冲区时会对PNG执行重新压缩,只要是合法的PNG格式字节流,都可以被Vision API正常识别,不会影响检测结果。
内容的提问来源于stack exchange,提问作者Honn
相关产品推荐
相关产品推荐

