gpt4 book ai didi

c# - 仅使用缩略图创建器 Azure Function 处理图像

转载 作者:行者123 更新时间:2023-12-03 07:01:08 24 4
gpt4 key购买 nike

我创建了一个简单的 Azure 函数,用于为上传到 Azure 上容器的图像创建缩略图,该缩略图由 BlobTrigger 触发。

它工作正常,但因为我的容器既有图像文件又有其他类型,例如PDF、Excel、Word 等,该功能由所有这些文件触发。

我想我可以通过确保我们只使用下面的代码处理图像文件来解决这个问题。它之所以有效,是因为它只处理图像文件,但它似乎仍然为目标容器中的其他文件类型创建占位符 blob。

例如,如果它在源容器中检测到名为 myfile.pdf 的文件,它仍会在目标容器中创建一个 myfile.pdf 但它是 0 字节。

如何确保完全跳过非图像文件,甚至不在目标容器中创建占位符?

[FunctionName("ImageResizer")]
public async Task Run([BlobTrigger("my-source-container/{name}", Connection = "myconnection")] Stream input, string name, [Blob("my-thumbnails-container/{name}", FileAccess.Write, Connection = "myconnection")] Stream outputBlob, ILogger log)
{
try
{
var fileExtension = FileUtils.GetFileExtension(name);
if (!string.IsNullOrEmpty(fileExtension))
{
if (fileExtension.ToLower() == "png" || fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
{
using (var image = Image.Load(input))
{
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(150, 150),
Mode = ResizeMode.Crop
}));

using (var ms = new MemoryStream())
{
if(fileExtension.ToLower() == "png")
await image.SaveAsPngAsync(outputBlob);
else if(fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
await image.SaveAsJpegAsync(outputBlob);
}
}

log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}

最佳答案

当使用属性进行声明性绑定(bind)时,这是不可避免的,除非您可以使用 BlobTrigger 属性以某种方式过滤掉不需要的 blob。输出绑定(bind)的默认行为是期望绑定(bind)是必要的,因此一旦执行该函数就会创建它。

但是,使用 .Net 语言,您可以使用运行时绑定(bind),因此只有实际处理的 blob 才会生成输出文件,请参阅 the docs 。这样您就可以更好地控制何时创建输出 blob。

[FunctionName("ImageResizer")]
public async Task Run([BlobTrigger("my-source-container/{name}", Connection = "myconnection")] Stream input, string name, IBinder binder, ILogger log)
{
try
{
var fileExtension = FileUtils.GetFileExtension(name);
if (!string.IsNullOrEmpty(fileExtension))
{
if (fileExtension.ToLower() == "png" || fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
{
using (var image = Image.Load(input))
{
image.Mutate(x => x.Resize(new ResizeOptions
{
Size = new Size(150, 150),
Mode = ResizeMode.Crop
}));

var attribute = new BlobAttribute("my-thumbnails-container/{name}", FileAccess.Write);
attribute.Connection = "myconnectionstring";
using (var ms = new MemoryStream())
using (var stream = await binder.BindAsync<Stream>(attribute))
{
if (fileExtension.ToLower() == "png")
await image.SaveAsPngAsync(stream);
else if (fileExtension.ToLower() == "jpg" || fileExtension.ToLower() == "jpeg")
await image.SaveAsJpegAsync(stream);
}
}

log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {input.Length} Bytes");
}
}
}
catch (Exception ex)
{
log.LogInformation(ex.Message, null);
}
}

Here这也是一篇博文,概述了我刚刚所做的事情。

关于c# - 仅使用缩略图创建器 Azure Function 处理图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72341486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com