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

如何在ASP.NET Core 7中实现图片动态裁剪与尺寸调整功能?

在ASP.NET Core 7中实现URL参数驱动的图片裁剪与缩放功能

1. 准备图片处理库

使用SixLabors.ImageSharp(跨平台、高性能的.NET图片处理库)实现裁剪和缩放逻辑。通过NuGet安装:

Install-Package SixLabors.ImageSharp
Install-Package SixLabors.ImageSharp.Drawing

2. 创建图片处理控制器

新建ImageProcessingController,配置路由匹配示例URL结构,处理请求并解析参数:

using Microsoft.AspNetCore.Mvc;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using System.IO;

public class ImageProcessingController : Controller
{
    // 匹配路由:domainName/Content/Upload/Images/{imagePath}
    [Route("Content/Upload/Images/{imagePath}")]
    [ResponseCache(Duration = 86400, Location = ResponseCacheLocation.Any)]
    public IActionResult GetImage(string imagePath, string anchor = "middlecenter", string crop = "auto", int? w = null, int? h = null)
    {
        // 构建原始图片路径(根据实际存储目录调整)
        var rootPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "Content", "Upload", "Images");
        var fullPath = Path.Combine(rootPath, imagePath);

        // 验证图片是否存在
        if (!System.IO.File.Exists(fullPath))
        {
            return NotFound();
        }

        // 解析锚点参数为ImageSharp枚举值
        var anchorMode = anchor.ToLower() switch
        {
            "middlecenter" => AnchorPositionMode.Center,
            "topleft" => AnchorPositionMode.TopLeft,
            "topright" => AnchorPositionMode.TopRight,
            "bottomleft" => AnchorPositionMode.BottomLeft,
            "bottomright" => AnchorPositionMode.BottomRight,
            _ => AnchorPositionMode.Center
        };

        // 解析裁剪模式
        var cropMode = crop.ToLower() switch
        {
            "auto" => ResizeMode.Crop,
            "pad" => ResizeMode.Pad,
            _ => ResizeMode.Crop
        };

        // 无尺寸参数时直接返回原图
        if (!w.HasValue && !h.HasValue)
        {
            return PhysicalFile(fullPath, GetContentType(fullPath));
        }

        // 使用ImageSharp处理图片
        using var image = Image.Load(fullPath);
        var resizeOptions = new ResizeOptions
        {
            Size = new Size(w ?? image.Width, h ?? image.Height),
            Mode = cropMode,
            Position = anchorMode
        };

        image.Mutate(x => x.Resize(resizeOptions));

        // 将处理后的图片写入内存流并返回
        using var ms = new MemoryStream();
        image.Save(ms, GetImageFormat(fullPath));
        ms.Position = 0;

        return File(ms, GetContentType(fullPath));
    }

    // 辅助方法:获取文件ContentType
    private string GetContentType(string path)
    {
        var extension = Path.GetExtension(path).ToLowerInvariant();
        return extension switch
        {
            ".jpg" or ".jpeg" => "image/jpeg",
            ".png" => "image/png",
            ".gif" => "image/gif",
            _ => "application/octet-stream"
        };
    }

    // 辅助方法:获取ImageSharp图片格式
    private SixLabors.ImageSharp.Formats.IImageFormat GetImageFormat(string path)
    {
        var extension = Path.GetExtension(path).ToLowerInvariant();
        return extension switch
        {
            ".jpg" or ".jpeg" => SixLabors.ImageSharp.Formats.Jpeg.JpegFormat.Instance,
            ".png" => SixLabors.ImageSharp.Formats.Png.PngFormat.Instance,
            ".gif" => SixLabors.ImageSharp.Formats.Gif.GifFormat.Instance,
            _ => SixLabors.ImageSharp.Formats.Jpeg.JpegFormat.Instance
        };
    }
}

3. 安全与性能优化

  • 路径安全校验:防止目录遍历攻击,添加参数验证:
    if (imagePath.Contains("../") || imagePath.Contains("..\\"))
    {
        return BadRequest("Invalid image path");
    }
    
  • 尺寸参数限制:避免超大尺寸导致内存溢出:
    if (w.HasValue && w.Value > 2000) w = 2000;
    if (h.HasValue && h.Value > 2000) h = 2000;
    
  • 缓存优化:利用[ResponseCache]让浏览器/CDN缓存处理后的图片;也可通过IMemoryCache缓存处理后的图片字节,减少重复计算。

4. 功能测试

启动应用后,访问示例格式的URL:
http://localhost:5000/Content/Upload/Images/bird.jpg?anchor=middlecenter&crop=auto&w=200&h=294
即可获取按参数处理后的图片。

内容的提问来源于stack exchange,提问作者jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:45:26