缩小PNG图片的尺寸

时间:2019-03-05 14:43:00

标签: c# image compression png

我要压缩PNG图片

我正在使用以下代码:(以下代码对于jpeg,jpg正常工作,但对png无效。

        var qualityParam = new EncoderParameter(Encoder.Quality,80);
        // PNG image codec 
        var pngCodec = GetEncoderInfo(ImageFormat.Png);
        var encoderParams = new EncoderParameters(1) { Param = { [0] = qualityParam } };

        rigImage.Save(imagePath, pngCodec, encoderParams);

        private static ImageCodecInfo GetEncoderInfo(ImageFormat format)
        {
          // Get image codecs for all image formats 
          var codecs = ImageCodecInfo.GetImageEncoders();

          // Find the correct image codec 
          return codecs.FirstOrDefault(t => t.FormatID == format.Guid);
         }

2 个答案:

答案 0 :(得分:1)

JPEG“效果很好”,因为它总是可以丢弃更多信息。

PNG是一种无损图像压缩格式,因此获得更好的压缩效果会比较棘手,并且存在很高的“低标记”。有诸如PNGOut或OxiPNG之类的工具专门用于优化PNG图像,但是大多数策略在计算上都非常昂贵,因此您的普通图像处理库不会打扰:

  • 您可以丢弃无关的元数据块
  • 您可以枚举并尝试各种过滤策略,这相当于以略微不同的调整将图像压缩数十次并检查出最佳效果
  • 您可以将DEFLATE实现从默认设置(通常是stdlib或系统标准)切换为更好但更昂贵的东西,例如zopfli
  • 最后-这绝对需要人的眼球-您可以尝试切换到码垛

如上所述,大多数图像库都不会为此而烦恼,它们会使用内置的zlib / deflate和一些默认过滤器,可能需要几分钟的时间才能使PNG遍历整个优化流程,并且机会将不存在。

答案 1 :(得分:0)

正如@Masklinn所说,PNG是一种无损格式,我认为.NET中的BCL没有可帮助您“优化” PNG大小的API。

相反,您可以使用 libimagequant 库;您可以获得有关此库here以及如何从.NET here来使用它的更多信息。

这是PNGoo所使用的库,在优化项目中的PNG时,我得到了令人印象深刻的结果。

此外,如果您打算在商业项目中使用该库,请记住许可条款,如https://pngquant.org/lib/所示。