Azure Blob上传图片后:原图尺寸调整及缩略图生成技术问题
解决Azure Function中调整超标原图尺寸的方案
我来帮你搞定这个原图尺寸调整的问题!结合你已经在用的ImageResizer库,咱们可以按照需求实现:当上传的图片尺寸超过900*900时,调整原图到最大900x900(保持比例)并覆盖原容器的文件,同时生成缩略图到另一容器。
核心思路
- 先读取上传图片的实际尺寸,判断是否超过900x900的阈值
- 如果超标,用ImageResizer调整原图尺寸,写入原容器的对应Blob
- 无论原图是否超标,都生成缩略图到目标容器(你已有的逻辑可以直接整合进来)
完整代码示例
首先确保你已经安装了ImageResizer和Azure.Storage.Blobs的NuGet包,然后修改你的Function代码如下:
using ImageResizer; using System.Drawing; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; public static class ImageProcessingFunction { [FunctionName("ImageResizeFunction")] public static void Run( // 触发:监听原容器的上传事件 [BlobTrigger("original-images/{name}", Connection = "AzureWebJobsStorage")] Stream originalImageStream, // 输出:调整后的原图,写回原容器 [Blob("original-images/{name}", FileAccess.Write, Connection = "AzureWebJobsStorage")] Stream resizedOriginalStream, // 输出:缩略图,写入另一容器 [Blob("thumbnails/{name}", FileAccess.Write, Connection = "AzureWebJobsStorage")] Stream thumbnailStream, string name, ILogger log) { try { // 读取原图尺寸 using (var image = Image.FromStream(originalImageStream)) { bool isOversized = image.Width > 900 || image.Height > 900; if (isOversized) { // 重置流指针到开头(因为刚才读取尺寸时指针移到了末尾) originalImageStream.Position = 0; // 配置调整参数:最大900x900,保持比例不裁剪 var resizeSettings = new ResizeSettings { MaxWidth = 900, MaxHeight = 900, Mode = FitMode.Max }; // 调整原图尺寸并写入原容器 ImageBuilder.Current.Build(originalImageStream, resizedOriginalStream, resizeSettings); log.LogInformation($"Successfully resized oversized image {name} to max 900x900"); } else { // 原图尺寸符合要求,直接复制回原容器(避免覆盖丢失) originalImageStream.Position = 0; originalImageStream.CopyTo(resizedOriginalStream); log.LogInformation($"Image {name} is within 900x900, no resize needed"); } // 生成缩略图(这里可以根据你的需求调整尺寸) originalImageStream.Position = 0; var thumbnailSettings = new ResizeSettings { MaxWidth = 200, MaxHeight = 200, Mode = FitMode.Max }; ImageBuilder.Current.Build(originalImageStream, thumbnailStream, thumbnailSettings); log.LogInformation($"Generated thumbnail for image {name}"); } } catch (Exception ex) { log.LogError(ex, $"Error processing image {name}"); throw; } } }
关键细节说明
- 流指针重置:每次读取流之后,一定要把
Position设回0,否则后续的读取/写入操作会从流的末尾开始,导致空内容 - 尺寸判断逻辑:这里用
Width > 900 || Height > 900来判定“超标”,如果你的需求是两者同时超过才调整,可以改成Width > 900 && Height > 900 - 保持比例:
FitMode.Max会确保图片按比例缩小,不会拉伸或裁剪,如果你需要强制缩放到900x900(可能变形),可以改成FitMode.Stretch - 覆盖原Blob:通过绑定原容器的
Write权限流,调整后的图片会直接覆盖原上传的文件,完全符合你的需求
内容的提问来源于stack exchange,提问作者Daina Hodges
相关产品推荐
相关产品推荐

