首页 > 解决方案 > 减小 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);
         }

标签: c#imagecompressionpng

解决方案


JPEG“工作正常”,因为它总是可以丢弃更多信息。

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

  • 您可以丢弃不相关的元数据块
  • 您可以列举并尝试各种过滤策略,这相当于压缩图像数十次,调整略有不同并检查出最好的
  • 您可以将 DEFLATE 实现从默认(通常是标准库或系统的标准)切换到更好但更昂贵的东西,如 zopfli
  • 最后——这个绝对需要人类的眼球——你可以尝试切换到托盘化

如上所述,大多数图像库根本不会为此烦恼,它们将使用内置的 zlib/deflate 和一些默认过滤器,使 PNG 通过整个优化管道可能需要几分钟,并且有机会获得将不存在。


推荐阅读