簡體   English   中英

減小 PNG 圖像的大小

[英]Reduce the size of the PNG image

我想壓縮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);
         }

JPEG“工作正常”,因為它總是可以丟棄更多信息。

PNG 是一種無損圖像壓縮格式,因此獲得更好的壓縮更棘手,並且有一個相當高的“低分”。 有像 PNGOut 或 OxiPNG 這樣的工具,它們僅用於優化 PNG 圖像,但大多數策略在計算上非常昂貴,因此您的普通圖像處理庫不會打擾:

  • 您可以丟棄不相關的元數據塊
  • 您可以列舉並嘗試各種過濾策略,這相當於使用略有不同的調整將圖像壓縮數十次並檢查出最好的
  • 您可以將 DEFLATE 實現從默認(通常是 stdlib 或系統標准)切換到更好但更昂貴的東西,如 zopfli
  • 最后——這個絕對需要人的眼球——你可以嘗試切換到托盤化

如上所述,大多數圖像庫根本不會為此煩惱,他們將使用內置的 zlib/deflate 和一些默認過濾器,使 PNG 通過整個優化管道可能需要幾分鍾的時間,並且有可能獲得收益將不存在。

正如@Masklinn 所說,PNG 是一種無損格式,我認為 .NET 中的 BCL 沒有可以幫助您“優化”PNG 大小的 API。

相反,您可以使用libimagequant庫; 您可以在此處獲得有關此庫的更多信息,以及如何在此處從 .NET 使用它。

這是PNGoo使用的同一個庫,在我的項目中優化 PNG 時,我得到了非常令人印象深刻的結果。

此外,如果您計划在商業項目中使用該庫,請記住許可條款,如https://pngquant.org/lib/ 所示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM