You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Blob上传图片后:原图尺寸调整及缩略图生成技术问题

解决Azure Function中调整超标原图尺寸的方案

我来帮你搞定这个原图尺寸调整的问题!结合你已经在用的ImageResizer库,咱们可以按照需求实现:当上传的图片尺寸超过900*900时,调整原图到最大900x900(保持比例)并覆盖原容器的文件,同时生成缩略图到另一容器。

核心思路

  1. 先读取上传图片的实际尺寸,判断是否超过900x900的阈值
  2. 如果超标,用ImageResizer调整原图尺寸,写入原容器的对应Blob
  3. 无论原图是否超标,都生成缩略图到目标容器(你已有的逻辑可以直接整合进来)

完整代码示例

首先确保你已经安装了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:06:37