Высокопроизводительная библиотека C# для преобразования растровых изображений в PNG.

Платформа .NET не предоставляет никаких параметров сжатия файлов PNG . Хотя встроенная поддержка подходит для большинства задач, которые у меня были до сих пор, у меня есть высокие требования к производительности, которые я надеюсь решить, используя меньшее сжатие и компенсируя это более высоким использованием памяти.

Я видел, что в NuGet доступно множество библиотек PNG, но из-за огромного количества результатов поиска мне трудно выбрать одну из них.

Вы работали с одной из этих библиотек и можете ли вы порекомендовать действительно быструю?

Целевая платформа .NET — 4.5; более высокие версии приемлемы.

Я пытался:

  • NuGet libpng , но не поддерживает .NET 4.5.
  • NuGet pngpp , но не поддерживает .NET 4.5
  • NuGet lpng , но не поддерживает .NET 4.5
  • NuGet ImageProcessor, но у него нет Save()метода
  • NuGet NGraphics, но GetImage().SaveAsPng()метод не имеет параметров для изменения сжатия
Для PNGS... Я хотел бы знать, какой уровень сжатия допустим? Вы можете изменить степень сжатия/количество попыток сжатия; Я использовал Ifranview и некоторые его плагины. Они вроде приличные по производительности. Еще одно предложение — ImageMagic, оно доступно по адресу imagemagick.org/script/index.php . Это был бы мой второй вариант.

Ответы (2)

Вы можете попробовать net-vips , привязку C # для libvips . Это ленивая, потоковая библиотека обработки изображений, управляемая запросами, поэтому она может выполнять подобные операции без необходимости загрузки всего изображения. NetVips совместим с .NET Standard >= 2.0 и .NET Framework >= 4.5.

Вы можете преобразовать изображение JPG в PNG следующим образом:

using Image image = Image.NewFromFile("image.jpg", access: Enums.Access.Sequential);
image.WriteToFile("image.png", new VOption
{
    {"compression", 9} // zlib compression 1-9
});
// Or: image.Pngsave("image.png", compression: 9);

См. документацию API libvips для vips_pngsave(операция, вызываемая WriteToFile) для получения подробной информации о том, какие аргументы поддерживаются.

Могу ли я предложить вам заглянуть в ImageMagick , эта библиотека существует с 1990 года и является очень зрелой. Это собственная библиотека с доступной версией .NET.

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

Версия .NET https://magick.codeplex.com/

В качестве примечания он также поддерживает OpenCL, но я не знаю, использует ли это код сохранения PNG. (если это произойдет, это значительно улучшит вашу экономию времени)

Я не смог понять, как сделать скриншот с библиотекой. Поэтому я использую нормаль Bitmap, чтобы сделать снимок экрана, а затем использую MagickImageдля сохранения файла. Это увеличило загрузку ЦП с ~ 4% до ~ 10%, поэтому у меня нет никакой выгоды.