PIL Image as Bytes with BytesIO 防止硬盘保存
PIL Image as Bytes with BytesIO to prevent hard disk saving
有问题
我有一个 PIL 图像,我想将它转换为字节数组。我无法将图像保存在我的硬盘上,所以我无法使用默认的 open(file_path, 'rb')
功能。
我试过的
为了解决这个问题,我正在尝试使用 io
库来执行此操作:
buf = io.BytesIO()
image.save(buf, format='JPEG')
b_image = buf.getvalue()
将图像视为功能性 PIL 图像。
“b_image”将用作 Microsoft Azure 认知服务功能的参数read_in_stream()
如果我们查看文档,我们可以看到这个函数图像参数必须是:
image
xref:Generator
Required
An image stream.
文档可用here
问题
当我执行它时出现错误:
File "C:...\envs\trainer\lib\site-packages\msrest\service_client.py", line 137, in stream_upload
chunk = data.read(self.config.connection.data_block_size)
AttributeError: 'bytes' object has no attribute 'read'
客户端身份验证或其他地方没有错误,因为当我将使用此行导入的图像作为参数时:
image = open("./1.jpg", 'rb')
一切正常..
来源
我还看到 post 准确地解释了我想做什么,但在我的情况下它不起作用。任何想法将不胜感激。
当我们使用方法read_in_stream
时,我们需要提供一个流。但是代码 BytesIO.getvalue
将 return 流的内容作为字符串或字节。所以请更新代码如下
buf = io.BytesIO()
image.save(buf, format='JPEG')
computervision_client.read_in_stream(buf)
详情请参考here
更新
关于这个问题,我建议你使用rest API来实现你的需求。
import io
import requests
from PIL import Image
import time
url = "{your endpoint}/vision/v3.1/read/analyze"
key = ''
headers = {
'Ocp-Apim-Subscription-Key': key,
'Content-Type': 'application/octet-stream'
}
// process image
...
with io.BytesIO() as buf:
im.save(buf, 'jpeg')
response = requests.request(
"POST", url, headers=headers, data=buf.getvalue())
# get result
while True:
res = requests.request(
"GET", response.headers['Operation-Location'], headers=headers)
status = res.json()['status']
if status == 'succeeded':
print(res.json()['analyzeResult'])
break
time.sleep(1)
有问题
我有一个 PIL 图像,我想将它转换为字节数组。我无法将图像保存在我的硬盘上,所以我无法使用默认的 open(file_path, 'rb')
功能。
我试过的
为了解决这个问题,我正在尝试使用 io
库来执行此操作:
buf = io.BytesIO()
image.save(buf, format='JPEG')
b_image = buf.getvalue()
将图像视为功能性 PIL 图像。
“b_image”将用作 Microsoft Azure 认知服务功能的参数read_in_stream()
如果我们查看文档,我们可以看到这个函数图像参数必须是:
image xref:Generator
Required
An image stream.
文档可用here
问题
当我执行它时出现错误:
File "C:...\envs\trainer\lib\site-packages\msrest\service_client.py", line 137, in stream_upload chunk = data.read(self.config.connection.data_block_size)
AttributeError: 'bytes' object has no attribute 'read'
客户端身份验证或其他地方没有错误,因为当我将使用此行导入的图像作为参数时:
image = open("./1.jpg", 'rb')
一切正常..
来源
我还看到
当我们使用方法read_in_stream
时,我们需要提供一个流。但是代码 BytesIO.getvalue
将 return 流的内容作为字符串或字节。所以请更新代码如下
buf = io.BytesIO()
image.save(buf, format='JPEG')
computervision_client.read_in_stream(buf)
详情请参考here
更新
关于这个问题,我建议你使用rest API来实现你的需求。
import io
import requests
from PIL import Image
import time
url = "{your endpoint}/vision/v3.1/read/analyze"
key = ''
headers = {
'Ocp-Apim-Subscription-Key': key,
'Content-Type': 'application/octet-stream'
}
// process image
...
with io.BytesIO() as buf:
im.save(buf, 'jpeg')
response = requests.request(
"POST", url, headers=headers, data=buf.getvalue())
# get result
while True:
res = requests.request(
"GET", response.headers['Operation-Location'], headers=headers)
status = res.json()['status']
if status == 'succeeded':
print(res.json()['analyzeResult'])
break
time.sleep(1)