Уменьшить размер изображения PNG - PullRequest
1 голос
/ 05 марта 2019

Я хочу сжать изображение 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 ]

1 голос
/ 05 марта 2019

JPEG «отлично работает», потому что он всегда может отбросить больше информации.

PNG - это формат сжатия изображений без потерь, так что получить лучшее сжатие сложнее, и есть довольно высокая «низкая оценка».Существуют такие инструменты, как PNGOut или OxiPNG, которые существуют исключительно для оптимизации изображений PNG, но большинство стратегий очень затратны в вычислительном отношении, поэтому ваша средняя библиотека обработки изображений просто не беспокоится:

  • вы можете отбросить ненужный блок метаданных
  • Вы можете перечислить и опробовать различные стратегии фильтрации, это сводится к сжатию изображения в десятки раз с немного отличающейся настройкой и проверке лучших
  • , которые вы можете отключить из реализации DEFLATE по умолчанию (обычно это стандартный или системный стандарт) к чему-то более качественному, но гораздо более дорогому, например, zopfli
  • , наконец, - и для этого абсолютно необходимы человеческие глазные яблоки - вы можете попробовать переключиться на поддон

Как отмечалосьвыше, большинство библиотек изображений просто не будут беспокоиться об этом, они будут использовать встроенный zlib / deflate и некоторый фильтр по умолчанию, может потребоваться несколько минут, чтобы PNG прошел весь конвейер оптимизации, и есть вероятность, что выигрыш будетне существоватьEnt.

0 голосов
/ 06 марта 2019

Как сказал @Masklinn, PNG - это формат без потерь, и я думаю, что BCL в .NET не имеет API, который может помочь вам "оптимизировать" размер PNG.

Вместо этого выможет использовать библиотеку libimagequant ;Вы можете получить больше информации об этой библиотеке здесь и о том, как использовать ее из .NET здесь .

Это та же библиотека, которая используется PNGoo , я получил действительно впечатляющие результаты при оптимизации PNG в моих проектах.

Кроме того, если вы планируете использовать библиотеку в коммерческом проекте, имейте в виду условия лицензии, указанные в https://pngquant.org/lib/.

...