将 Azure 存储 blob 读入 matplotlib

Read Azure Storage blob into matplotlib

我正在 Azure Functions 环境中使用 matplotlib.pyplot 和 Azure 存储 blob (azure.storage.blob)(不应访问文件系统)。

我的目标是得到一个 blob:

service = blob.BlobServiceClient(account_url="https://mysa.blob.core.windows.net", credential=SA_PRIMARY_KEY)
blob_client = service.get_blob_client(container="mycontainer", blob="myimg.JPG")
blob_data = blob_client.download_blob()

然后使用 imread 使用 pyplot 打开它,例如:

img = plt.imread(blob_data_to_read_opened_stream, format="JPG")

所以我想我漏掉了一块。获得 blob_data 对象后,需要将其内容复制到流中,并将其传递给 pyplot

with open("./BlockDestination.jpg", "wb") as blob_stream:
    blob_data = blob.download_blob()
    blob_data.readinto(blob_stream)
    img = plt.imread(blob_stream, format="JPG")

这会失败,因为 imread 需要

file-like object opened in read-binary mode

如何在不打开两个不同流的情况下实现我的目标?

您可以生成一个 SAS token 并使用它直接从您的存储帐户中读取图像,而不是下载图像并读取它们。可以缓解服务器压力,这里只有一个读流。试试下面的代码:

from azure.storage.blob import ResourceTypes, AccountSasPermissions, generate_account_sas,BlobServiceClient
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import matplotlib.cbook as cbook

connStr = '<storage account connection string>'
containerName ='<container name>'
blobName = "<image name>"

blob_service_client = BlobServiceClient.from_connection_string(connStr)

sas_token = generate_account_sas(
    blob_service_client.account_name,
    account_key=blob_service_client.credential.account_key,
    resource_types=ResourceTypes(object=True),
    permission=AccountSasPermissions(read=True),
    expiry=datetime.utcnow() + timedelta(hours=1)
)

destImageUrl = blob_service_client.primary_endpoint + containerName + "/" + blobName + "?" + sas_token

image  = plt.imread(destImageUrl , format="JPG")

fig, ax = plt.subplots()
im = ax.imshow(image)
patch = patches.Circle((260, 200), radius=200, transform=ax.transData)
im.set_clip_path(patch)

ax.axis('off')
plt.show()

我的 .jpg 文件内容:

结果: