65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2023 年 1 月 25 日

CPOL

1分钟阅读

viewsIcon

13319

这是一个 ASP.NET Core 7 Web API 项目,我们可以用它来压缩图像。

引言

在这个项目中,我们可以找到 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

历史

  • 2023 年 1 月 25 日:初始版本
© . All rights reserved.