我具有调整图像大小的Azure功能。
[FunctionName(nameof(ResizeBlob))]
public static async Task ResizeBlob(
[BlobTrigger("originals/{name}")] CloudBlockBlob inputBlob,
[Blob("resized/{name}", FileAccess.Write)] Stream outputBlob,
ILogger log)
{
await inputBlob.FetchAttributesAsync();
if (!inputBlob.Metadata.ContainsKey("Resized") || inputBlob.Metadata["Resized"] == bool.FalseString)
{
var inputBlobStream = await inputBlob.OpenReadAsync();
using (var image = Image.Load(inputBlobStream))
{
image.Mutate(x => x.Resize(1920, 1080));
image.Save(outputBlob, new JpegEncoder());
// If comment next statements, everything is ok, otherwise - it's not saving correctly
inputBlob.Metadata["ResizedFHD"] = bool.TrueString;
await inputBlob.SetMetadataAsync();
}
}
}
因为我无法停止在元数据更新上触发[BlobTrigger],所以我需要通过添加特殊的元数据来解决调整多个文件大小的问题。但是,调整大小后,我无法设置此元数据-它会导致对象长度为0。
但是,如果我用元数据更新注释行,则一切正常,并且可以创建blob。
有什么想法吗?
答案 0 :(得分:0)
首先,我测试您的代码,即使将其部署到Azure上,它也可能对我有用。因此,然后我将outputBlob
绑定更改为CloudBlockBlob
并使用UploadFromStreamAsync
上传blob,然后遇到了同样的问题。经过研究,我想这是由image.Save()
方法引起的,使用JpegEncoder,流应该设置正确的位置。
下面的代码是我的CloudBlockBlob
类型的代码,您可以尝试一下。
public static async System.Threading.Tasks.Task RunAsync([BlobTrigger("image/{name}", Connection = "AzureWebJobsStorage")]CloudBlockBlob inputBlob,
[Blob("resized/{name}", FileAccess.Write)] CloudBlockBlob outputBlob, string name, ILogger log)
{
if (!inputBlob.Metadata.ContainsKey("Resized") || inputBlob.Metadata["Resized"] == bool.FalseString)
{
var inputBlobStream = await inputBlob.OpenReadAsync();
System.IO.MemoryStream blobstream = new System.IO.MemoryStream();
using (var image = Image.Load(inputBlobStream))
{
image.Mutate(x => x.Resize(1920, 1080));
image.Save(blobstream , new JpegEncoder());
blobstream.Seek(0, SeekOrigin.Begin);
await outputBlob.UploadFromStreamAsync(blobstream);
// If comment next statements, everything is ok, otherwise - it's not saving correctly
inputBlob.Metadata["ResizedFHD"] = bool.TrueString;
await inputBlob.SetMetadataAsync();
}
}
如果您仍然想使用Stream outputBlob
绑定,也许可以使用相同的方式,只需更改几行代码即可。
image.Mutate(x => x.Resize(1920, 1080));
//image.Save(outputBlob, new JpegEncoder());
image.Save(blobstream, new JpegEncoder());
blobstream.Seek(0, SeekOrigin.Begin);
blobstream.CopyTo(outputBlob, 1024);
假设这两种方法都可以使用,如果您对功能仍然感到困惑,请提供更多信息或您的环境,以便我们进行更详细的测试。