在本教程中,你将了解如何将图像上传到 Azure Blob 存储并使用 Azure Functions 和计算机视觉对其进行处理。 你还将了解如何在此过程中实现 Azure Function 触发器和绑定。 这些服务将一起分析包含文本的上传图像,从中提取文本,然后将文本存储在数据库行中,供以后分析或用于其他用途。
Azure Blob 存储是 Microsoft 针对云提供的可大规模缩放的对象存储解决方案。 Blob 存储设计用于存储图像和文档、流式处理媒体文件、管理备份和存档数据等等。 有关 Blob 存储的详细信息,请阅读
概述页面
。
Azure Functions 是一种无服务器计算机解决方案,允许你编写和运行小块代码作为高度可缩放、无服务器、事件驱动的函数。 有关 Azure Functions 的详细信息,请阅读
概述页面
。
本教程介绍以下操作:
将图像和文件上传到 Blob 存储
使用 Azure Function 事件触发器处理上传到 Blob 存储的数据
使用认知服务分析图像
使用 Azure Function 输出绑定将数据写入表存储
具有活动订阅的 Azure 帐户。
免费创建帐户
。
已安装
Visual Studio Code
。
Azure Functions 扩展
,用于部署和配置函数应用。
Azure 存储扩展
Azure 资源扩展
创建存储帐户和容器
第一步是创建存储帐户来保存上传的 blob 数据,在本方案中为包含文本的图像。 存储帐户提供多种不同的服务,但本教程使用 Blob 存储和表存储。
Visual Studio Code
Azure 门户
Azure CLI
仍在 Azure 资源浏览器中,找到新的存储资源,展开资源以查看节点。
右键单击“Blob 容器”,然后选择“创建 Blob 容器”。
输入名称
imageanalysis
。 这将创建一个专用容器。
在 Azure 门户中从专用容器更改为公共容器
此过程需要一个公共容器。 若要更改该配置,请在 Azure 门户中进行更改。
右键单击 Azure 资源管理器中的存储资源,选择“在门户中打开”。
在“数据存储”部分,选择“容器”。
找到容器
imageanalysis
,然后选择行尾的
...
(省略号)。
选择“更改访问级别”。
选择“Blob (仅匿名读取访问 blob)”,然后选择“确定”。
返回到 Visual Studio Code。
在 Visual Studio Code 中检索连接字符串
在 Visual Studio Code 中,选择
Shift
+
Alt
+
A
以打开 Azure 资源管理器。
右键单击存储资源,然后选择“复制连接字符串”。
将该内容粘贴到某个位置,以供稍后使用。
还需要记下存储帐户名称
msdocsstoragefunction
,以供稍后使用。
订阅
:选择所需的订阅。
资源组
:选择“新建”并输入名称
msdocs-storage-function
,然后选择“确定”。
存储帐户名称
:输入值
msdocsstoragefunction
。 存储帐户名称在 Azure 中必须是唯一的,因此你可能需要在名称后面添加数字,例如
msdocsstoragefunction123
。
区域
:选择离你最近的区域。
性能
:选择“标准”。
冗余
:保持选中默认值。
Azure CLI 命令可以在
Azure Cloud Shell
中或是
安装了 Azure CLI
的工作站上运行。
若要创建存储帐户和容器,可以运行如下所示的 CLI 命令。
az group create --location eastus --name msdocs-storage-function \
az storage account create --name msdocsstorageaccount --resource-group msdocs-storage-function -l eastus --sku Standard_LRS \
az storage container create --name imageanalysis --account-name msdocsstorageaccount --resource-group msdocs-storage-function
你可能需要稍等片刻,让 Azure 预配这些资源。
命令完成后,还需要检索存储帐户的连接字符串。 稍后将使用连接字符串将 Azure Function 连接到存储帐户。
az storage account show-connection-string -g msdocs-storage-function -n msdocsstorageaccount
复制 connectionString
属性的值,并将其粘贴到某处供稍后使用。 此外,还需要记下存储帐户名称 msdocsstoragefunction
供稍后使用。
创建计算机视觉服务
接下来,创建计算机视觉服务帐户来处理上传的文件。 计算机视觉是 Azure 认知服务的一部分,可提供各种用于从图像中提取数据的功能。 有关计算机视觉的详细信息,请阅读概述页面。
Azure 门户
Azure CLI
选择底部的“查看 + 创建”。 Azure 会花点时间验证输入的信息。 验证设置后,选择“创建”,Azure 将开始预配计算机视觉服务,这可能需要一些时间。
操作完成后,选择“转到资源”。
接下来,我们需要找到计算机视觉服务的密钥和终结点 URL,以在 Azure Function App 中使用。
在“计算机视觉”概述页面上,选择“密钥和终结点”。
在“密钥和终结点”页面上,复制“密钥 1”值和“终结点”值,并将它们粘贴到某处供稍后使用。 终结点的格式应为 https://YOUR-RESOURCE-NAME.cognitiveservices.azure.com/
若要创建计算机视觉服务,可以运行以下 CLI 命令。
az cognitiveservices account create \
--name msdocs-process-image \
--resource-group msdocs-storage-function \
--kind ComputerVision \
--sku F1 \
--location eastus2 \
--yes
你可能需要稍等片刻,让 Azure 预配这些资源。
创建计算机视觉服务后,可以使用以下命令检索密钥和 URL 终结点。
az cognitiveservices account keys list \
--name msdocs-process-image \
--resource-group msdocs-storage-function \
az cognitiveservices account list \
--name msdocs-process-image \
--resource-group msdocs-storage-function --query "[].properties.endpoint"
本教程中使用的 Azure 函数的代码可在此 GitHub 存储库 的 JavaScript 子目录中找到。 也可以使用以下命令克隆项目。
git clone https://github.com/Azure-Samples/msdocs-storage-bind-function-service.git \
cd msdocs-storage-bind-function-service/javascript \
code .
示例项目将完成以下任务:
检索环境变量以连接到存储帐户和计算机视觉服务
接受上传的文件作为 blob 参数
使用计算机视觉服务分析 blob
使用输出绑定将分析后的图像文本发送到新表行
下载并打开项目后,需要了解一些基本概念:
数据输入 - BlobTrigger ("type": "blobTrigger"
) 用于将函数绑定到 Blob 存储中的上传事件。 触发器有两个必需的参数:
path
:触发器监视事件的路径。 该路径包括容器名称 imageanalysis
以及 blob 名称的变量替换。 此 blob 名称是从 name
属性中检索的。
name
:已上传的 blob 的名称。 myBlob
的使用是传入函数的 blob 的参数名称。 请勿更改值 myBlob
。
connection
:存储帐户的连接字符串。 值 StorageConnection
与 local.settings.json
文件中的名称匹配。
数据输出 - TableBinding ("type": "table"
) 用于将出站数据绑定到存储表。
tableName
:写入函数返回的已分析图像文本值的表的名称。 该表必须已存在。
connection
:存储帐户的连接字符串。 值 StorageConnection
与 local.settings.json
文件中的名称匹配。
// ProcessImageUpload/index.js
const { v4: uuidv4 } = require('uuid');
const { ApiKeyCredentials } = require('@azure/ms-rest-js');
const { ComputerVisionClient } = require('@azure/cognitiveservices-computervision');
const sleep = require('util').promisify(setTimeout);
const STATUS_SUCCEEDED = "succeeded";
const STATUS_FAILED = "failed"
async function readFileUrl(context, computerVisionClient, url) {
try {
context.log(`uri = ${url}`);
// To recognize text in a local image, replace client.read() with readTextInStream() as shown:
let result = await computerVisionClient.read(url);
// Operation ID is last path segment of operationLocation (a URL)
let operation = result.operationLocation.split('/').slice(-1)[0];
// Wait for read recognition to complete
// result.status is initially undefined, since it's the result of read
while (result.status !== STATUS_SUCCEEDED) {
await sleep(1000);
result = await computerVisionClient.getReadResult(operation);
let contents = "";
result.analyzeResult.readResults.map((page) => {
page.lines.map(line => {
contents += line.text + "\n\r"
return contents;
} catch (err) {
console.log(err);
module.exports = async function (context, myBlob) {
try {
context.log("JavaScript blob trigger function processed blob \n Blob:", context.bindingData.blobTrigger, "\n Blob Size:", myBlob.length, "Bytes");
const computerVision_ResourceKey = process.env.ComputerVisionKey;
const computerVision_Endpoint = process.env.ComputerVisionEndPoint;
const computerVisionClient = new ComputerVisionClient(
new ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': computerVision_ResourceKey } }), computerVision_Endpoint);
// URL must be full path
const textContext = await readFileUrl(context, computerVisionClient, context.bindingData.uri);
context.bindings.tableBinding = [];
context.bindings.tableBinding.push({
PartitionKey: "Images",
RowKey: uuidv4().toString(),
Text: textContext
} catch (err) {
context.log(err);
return;
此代码还从环境变量中检索基本配置值,例如 Blob 存储连接字符串和计算机视觉密钥。 这些环境变量在部署后添加到 Azure 函数环境。
默认函数还使用称为 AnalyzeImage
的第二种方法。 此代码使用计算机视觉帐户的 URL 终结点和密钥向计算机视觉发出处理图像的请求。 该请求返回图像中发现的所有文本。 此文本使用出站绑定写入表存储。
若要在本地运行项目,请在 ./local.settings.json
文件中输入环境变量。 使用之前在创建 Azure 资源时保存的值填充占位符值。
尽管 Azure 函数代码在本地运行,但它将连接到基于云的存储服务,而不是使用任何本地模拟器。
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "",
"FUNCTIONS_WORKER_RUNTIME": "node",
"StorageConnection": "your-storage-account-connection-string",
"StorageAccountName": "your-storage-account-name",
"StorageContainerName": "your-storage-container-name",
"ComputerVisionKey": "your-computer-vision-key",
"ComputerVisionEndPoint": "https://REPLACE-WITH-YOUR-RESOURCE-NAME.cognitiveservices.azure.com/"
创建 Azure Functions 应用
现在可以使用 Visual Studio Code 扩展将应用程序部署到 Azure。
在 Visual Studio Code 中,选择 Shift + Alt + A 以打开 Azure 资源管理器。
在“Functions”部分,找到并右键单击订阅,然后选择“在 Azure 中创建函数应用(高级)”。
使用下表创建函数资源。
上一个资源创建过程完成后,在 Azure 资源管理器的“Functions”部分中右键单击新资源,然后选择“部署到函数应用”。
如果系统询问“是否确定要部署...”,请选择“部署”。
该过程完成后,会显示一条通知,其中包含“上传设置”的选项。 选择该选项。 这会将值从 local.settings.json 文件复制到 Azure 函数应用中。 如果通知在你进行选择之前就消失了,请继续执行下一部分。
为存储和计算机视觉添加应用设置
如果在通知中选择了“上传设置”,请跳过此部分。
Azure 函数已成功部署,但它还无法连接到存储帐户和计算机视觉服务。 必须先将正确的密钥和连接字符串添加到 Azure Functions 应用的配置设置。
在 Azure 资源管理器的“Functions”部分,查找你的资源,右键单击“应用程序设置”,然后选择“添加新设置”。
为以下机密输入新的应用设置。 将机密值从本地项目复制并粘贴到 local.settings.json
文件中。
将 Azure Function 连接到不同服务所需的所有环境变量现已到位。
将图像上传到 Blob 存储
现在可以测试应用程序了! 你可以将 blob 上传到容器,然后验证图像中的文本是否已保存到表存储。
在 Visual Studio Code 的 Azure 资源管理器中,在“存储”部分查找并展开你的存储资源。
展开“Blob 容器”,右键单击容器名称 imageanalysis
,然后选择“上传文件”。
你可以在可下载示例项目的根目录的 images 文件夹中找到一些示例图像,也可以使用自己的图像。
对于“目标目录”,接受默认值 /
。
等待文件上传并列在容器中。
查看图片的文本分析
接下来,可以验证上传是否触发了 Azure Function,以及图像中的文本是否已正确分析并保存到表存储中。
在 Visual Studio Code 的 Azure 资源管理器中,在同一存储资源下,展开“表”查找你的资源。
ImageText 表现在应该可用。 单击该表可预览其中的数据行。 你应会看到已上传文件的已处理图像文本的条目。 可以使用时间戳或通过查看“文本”列的内容来验证这一点。
恭喜! 你已成功使用 Azure Functions 和计算机视觉处理上传到 Blob 存储的图像。
请使用下表帮助解决此过程中的问题。