将 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 文件内容:
结果:
我正在 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 文件内容:
结果: