【问题标题】:Reduce the size of the PNG image减小PNG图像的大小
【发布时间】:2019-07-27 01:42:54
【问题描述】:

我想压缩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);
         }

【问题讨论】:

  • "but not for png" - 好的,错误信息是什么?
  • @HenkHolterman 不会减小图像的大小。

标签: c# image compression png


【解决方案1】:

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

PNG 是一种无损图像压缩格式,因此获得更好的压缩效果比较棘手,并且存在相当高的“低分”。有像 PNGOut 或 OxiPNG 这样的工具,它们仅用于优化 PNG 图像,但大多数策略的计算量都非常大,因此您的普通图像处理库根本不会打扰:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 2018-10-14
      • 2020-08-18
      • 1970-01-01
      • 2017-02-06
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多