如何使用 .NET Core 压缩图像尺寸?

4
我正在使用.NET Core 2.2。在我的代码中,我正在使用IFormFile来上传图片。我该如何在它上传到服务器之前压缩图片大小(以KB为单位)?我搜索了解决方案,但那些答案都与Bitmap相关,但由于我使用的是IFormFile,因此我想要与之相关的解决方案。
我将在内部检查图像大小,如果大小高达700KB,则不想压缩。但如果更大,则要压缩并上传。样例代码会非常有用。
我尝试使用Magick.NET软件包。我该如何将IFormFile转换为MagickImage类型?
foreach(IFormFile photo in Images)  
{
  using (MagickImage mi = photo)  // Cannot implicitly convert type 
                                  //Microsoft.AspNetCore.Http.IFormFile to ImageMagick.MagickImage
   {
      mi.Format = Image.Jpeg;
      mi.Resize(40, 40);
      mi.Quality = 10;
      mi.Write(imageFile);
   }
}

你提到的 before upload 是指“从浏览器上传到服务器之前”还是“在上传到当前服务器后再上传到另一个服务器之前”?如果你想在上传之前压缩文件,那么用 C# 编写的服务器无法处理。你应该寻找一些 JavaScript 解决方案。 - Anduin Xue
  1. 在使用C#时,您无法在图像上传之前执行任何操作。
  2. 您无法明确控制图像的大小,只能控制其质量。您可以使用一些递归算法,从最大值开始逐步降低质量,直到文件大小在可接受范围内,但这可能需要多次递归,并且根据上传的文件大小,可能会导致性能问题。
- Chris Pratt
1个回答

19

我曾使用Magick.NET库来压缩图片,这个库可以用于.NET和.NET Core。欲知详情,请参阅其文档。

在您的情况下,您需要将图像暂时保存在某个位置并使用路径(类似于我的示例),或者将其转换为内存中的字节数组并读取它,因为它接受Byte[]

     using (MagickImage image = new MagickImage(@"YourImage.jpg"))
       {
           image.Format = image.Format; // Get or Set the format of the image.
           image.Resize(40, 40); // fit the image into the requested width and height. 
           image.Quality = 10; // This is the Compression level.
           image.Write("YourFinalImage.jpg");                 
        }

问题是,我无法将类型IFormFile转换为MagickImage类型。我已经更新了问题。你能帮忙找到正确的方法吗? - Vim
1
使用 (MagickImage mi = new MagickImage(photo)) - Joel Wiklund
1
@Benjamin 由于上传的图像大小可能不同,如果我保持image.Quality = 10(或任何其他数字),那么尽管它会减小图像大小(1MB被降至83KB,这很好),但是否有一种方法使其低于某个大小,比如我希望将转换后的图像大小最大为700KB(具有原始分辨率),无论原始大小是5MB、10MB还是20MB。我不希望图像只有83KB,因为质量会受到太大的影响。我不想要高质量的图像,但也不想要像83KB质量那样太低。 - Vim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接