使用 io.BytesIO 从天蓝色存储读取图像?

Posted

技术标签:

【中文标题】使用 io.BytesIO 从天蓝色存储读取图像?【英文标题】:reading an image from azure storage using io.BytesIO? 【发布时间】:2018-09-15 23:24:44 【问题描述】:

我有一个包含一些图像的天蓝色 blob 存储帐户。我想将它们作为字节读取以进行图像处理,因此我可以将它们与 Microsoft 的 Face API 一起使用。我收到一条错误消息,告诉我我需要一个“字节”对象,但我认为我已经将图像从 blob 转换为字节格式。我已经提供了我使用的全部代码,但问题来自最后一段代码

%matplotlib inline
import matplotlib.pyplot as plt
import io
from io import StringIO
import numpy as np
import cv2
from PIL import Image
#from StringIO import StringIO
from PIL import Image
import os
from array import array

我的凭据:

azure_storage_account_name = 'musicsurveyphotostorage'
azure_storage_account_key = None  # dont need key... we will access public 
blob... 

if azure_storage_account_name is None:
raise Exception("You must provide a name for an Azure Storage account")   
from azure.storage.blob import BlockBlobService
blob_service = BlockBlobService(azure_storage_account_name, 
azure_storage_account_key)

选择 Blob 存储容器

#select container (folder) name where the files resides
container_name = 'musicsurveyphotostorage'

#list files in the selected folder
generator = blob_service.list_blobs(container_name)   
blob_prefix = 'https://0.blob.core.windows.net/1/2'

正在加载图像..错误来自以下代码块:

# load image file to process
blob_name = 'shiba.jpg'  #name of image I have stored
blob = blob_service.get_blob_to_bytes(container_name, blob_name)
image_file_in_mem = io.BytesIO(blob)
img_bytes = Image.open(image_file_in_mem)

我得到的错误信息如下:

TypeError   Traceback (most recent call last)
<ipython-input-13-6738e5733c01> in <module>()
 36 blob_name = 'shiba.jpg'  #name of image I have stored
 37 blob = blob_service.get_blob_to_bytes(container_name, blob_name)
**---> 38 image_file_in_mem = io.BytesIO(blob)**
 39 img_bytes = Image.open(image_file_in_mem)

TypeError: a bytes-like object is required, not 'Blob'

【问题讨论】:

【参考方案1】:

我手头没有要测试的帐户,但查看文档,get_blob_to_bytes() 返回一个 Blob 实例 - 以获取调用其 content 属性所需的实际字节,即:

blob = blob_service.get_blob_to_bytes(container_name, blob_name)
image_file_in_mem = io.BytesIO(blob.content)
img_bytes = Image.open(image_file_in_mem)
# ...

【讨论】:

你比我快 10 秒 :)。这是完全正确的!

以上是关于使用 io.BytesIO 从天蓝色存储读取图像?的主要内容,如果未能解决你的问题,请参考以下文章

python wave 库 读取 BytesIO 对象的注意事项

引发 UnidentifiedImageError(PIL.UnidentifiedImageError: 无法识别图像文件 <_io.BytesIO 对象位于 0x0000018CA596D3

UnidentifiedImageError: 无法识别图像文件 <_io.BytesIO object at 0x000002154C6AE400>

pythonio.BytesIO简要介绍及示例

io.BytesIO非常慢。备择方案?优化?

将 io.BytesIO 转换为 io.StringIO 以解析 HTML 页面