在 ASP.NET核 7 Web API 中压缩上传的图像

目录

介绍

创建.NET 7项目的准则

运行命令

Swagger


介绍

在这个项目中,我们可以找到ASP.NET Core Web API来压缩上传的图像并将压缩的图像保存到./wwwroot/images文件夹中。

创建.NET 7项目的准则

打开Visual Studio 2022,然后创建一个新项目。在模板中搜索 ASP.NET Core Web API,然后选择下一步

然后给出下面的项目名称:

现在,如下面给出的屏幕截图所示。选择.NET Framework,即.NET 7,并保持其余内容不变,然后单击下一步按钮。

现在,创建名为 ImageCompressController.cs 的控制器并创建名称为UploadImage()HttpPost方法。

 [HttpPost]
 [RequestFormLimits(MultipartBodyLengthLimit = 104857600)]
 [RequestSizeLimit(104857600)]
public IActionResult UploadImage([FromForm] FileUploadModel model) 
{
  try
   {
    // this is the directory where file is upload
    var uploadFolder = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/images");
    if (!Directory.Exists(uploadFolder))
    {
     Directory.CreateDirectory(uploadFolder);
    }
    // this is the place where file is uploaded
    string fileUrl = Path.Combine(uploadFolder, 
                     $"{Guid.NewGuid()}_{model.file.FileName}");
    Stream strm = model.file.OpenReadStream();
    CompressImage.Compressimage(strm, fileUrl);
    return Ok(new { message = "Compressed successfully" });
  }
  catch (Exception ex)
  {
  _logger.LogError
   (ex, "An error occured while trying to compress the uploaded image.");
  return BadRequest(new { message = ex.Message });
 }
}

创建一个FileUploadModel类,该类是post API的请求模型。此类包含IFormFile属性。

public class FileUploadModel
{
    public IFormFile file { get; set; }
}

util 文件夹中创建类 CompressImage.cs该文件夹是创建压缩图像函数的帮助程序类。

public class CompressImage
{ 
    public static void Compressimage(Stream srcImgStream, string targetPath)
    {
      try
      {
            // Convert stream to image
            using var image = Image.FromStream(srcImgStream);
            
            float maxHeight = 900.0f;
            float maxWidth = 900.0f;
            int newWidth;
            int newHeight;

            var originalBMP = new Bitmap(srcImgStream);
            int originalWidth = originalBMP.Width;
            int originalHeight = originalBMP.Height;
            
            if (originalWidth > maxWidth || originalHeight > maxHeight)
            {
                // To preserve the aspect ratio  
                float ratioX = (float)maxWidth / (float)originalWidth;
                float ratioY = (float)maxHeight / (float)originalHeight;
                float ratio = Math.Min(ratioX, ratioY);
                newWidth = (int)(originalWidth * ratio);
                newHeight = (int)(originalHeight * ratio);
            }

            else
            {
                newWidth = (int)originalWidth;
                newHeight = (int)originalHeight;
            }

            var bitmap = new Bitmap(originalBMP, newWidth, newHeight);
            var imgGraph = Graphics.FromImage(bitmap);

            imgGraph.SmoothingMode = SmoothingMode.Default;
            imgGraph.InterpolationMode = InterpolationMode.HighQualityBicubic;
            imgGraph.DrawImage(originalBMP, 0, 0, newWidth, newHeight);
            
            var extension = Path.GetExtension(targetPath).ToLower();
            // for file extension having png and gif
            if (extension == ".png" || extension == ".gif")
            {
                // Save image to targetPath
                bitmap.Save(targetPath, image.RawFormat);
            }

            // for file extension having .jpg or .jpeg
            else if (extension == ".jpg" || extension == ".jpeg")
            {
                ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
                Encoder myEncoder = Encoder.Quality;
                var encoderParameters = new EncoderParameters(1);
                var parameter = new EncoderParameter(myEncoder, 50L);
                encoderParameters.Param[0] = parameter;

                // Save image to targetPath
                bitmap.Save(targetPath, jpgEncoder, encoderParameters);
            }
            bitmap.Dispose();
            imgGraph.Dispose();
            originalBMP.Dispose();
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    
    public static ImageCodecInfo GetEncoder(ImageFormat format)
    {
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FormatID == format.Guid)
            {
                return codec;
            }
        }
        return null;
    }
}

在上面的函数中,下面的部分用于以纵横比裁剪图像。如果原始图像的高度和宽度大于纵横比,则将其裁剪为所需的比例,否则原始图像比例不会发生变化。

if (originalWidth > maxWidth || originalHeight > maxHeight)
{
  // To preserve the aspect ratio
  float ratioX = (float)maxWidth / (float)originalWidth;
  float ratioY = (float)maxHeight / (float)originalHeight;
  float ratio = Math.Min(ratioX, ratioY);
  newWidth = (int)(originalWidth * ratio);
  newHeight = (int)(originalHeight * ratio);
}

else
{
  newWidth = (int)originalWidth;
  newHeight = (int)originalHeight;
}

var bitmap = new Bitmap(originalBMP, newWidth, newHeight);
var imgGraph = Graphics.FromImage(bitmap);

.jpg.jpeg图像的编码质量为50%50L表示压缩图像的质量。

// for file extension having png and gif
 if (extension == ".png" || extension == ".gif")
 {
     // Save image to targetPath
     bitmap.Save(targetPath, image.RawFormat);
 }

 // for file extension having .jpg or .jpeg
 else if (extension == ".jpg" || extension == ".jpeg")
 {
     ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
     Encoder myEncoder = Encoder.Quality;
     var encoderParameters = new EncoderParameters(1);
     var parameter = new EncoderParameter(myEncoder, 50L);
     encoderParameters.Param[0] = parameter;

     // Save image to targetPath
     bitmap.Save(targetPath, jpgEncoder, encoderParameters);
}

bitmap.Save()用于将压缩图像保存在目标路径中。

这就是使用ASP.NET Core 7 Web API压缩图像并将其保存到所需文件路径方式。

运行命令

dotnet watch run

Swagger

https://www.codeproject.com/Tips/5352886/Compress-Uploaded-Image-in-ASP-NET-Core-7-Web-API

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值