Управляемая библиотека оптимизации PNG доступна?

Я собираюсь встроить в свои сборки оптимизацию PNG (своего рода "sqeezer/squisher" PNG) (TFS 2010 Build Workflow). Я хочу создать новое действие по сборке, и, как и все мои действия, я предпочитаю, чтобы весь мой код управлялся практически без зависимостей.

Я искал (Googled) и нашел много разных библиотек PNG для оптимизации PNG. PNGOUT, PNGCRUSH, OptiPNG и т. Д. Ни один из них не является действительно.NET. Все они кажутся отличными инструментами. Я предпочитаю не вызывать EXE-файлы (отдельные процессы) из моего кода деятельности, потому что вы никогда не знаете, что произойдет (менее надежно).

Поэтому я подумал, что, возможно, PNGGauntlet подойдет. Но, посмотрев быстро на установленное приложение, это просто C# GUI, который вызывает двоичный файл pngout.exe. Это именно то, что я не хочу делать.

Поэтому мой вопрос таков: есть ли открытая и / или бесплатная библиотека.NET (DLL), которая выполняет сжатие PNG?

4 ответа

Решение

Я только что нашел это: nQuant. Со страницы проекта:

nQuant - это квантизатор цвета.net, который производит высококачественные 256-цветные 8-битные PNG-изображения nQuant часто уменьшает размер 32-битного изображения до размера, в 3 раза меньшего, чем его оригинал, с качеством, превосходящим то, что производят стандартные утилиты командной строки C.

Я протестировал его с некоторыми примерами PNG, и он действительно дает хороший 8-битный вывод, меньший, чем собственный 8-битный кодер.NET и без видимого сглаживания, даже для сглаженных изображений. Однако я упускаю одну вещь: обработка может быть немного медленной, но библиотека, к сожалению, не имеет распараллеленного варианта кода оптимизации. Я работаю над решением для этого.

ОБНОВЛЕНИЕ (21 января 2013 г.), я произвел рефакторинг кода, теперь он работает в 10 раз быстрее, даже без параллельных потоков. Вилка находится здесь: http://nquant.codeplex.com/SourceControl/network/forks/breki74/nQuantFaster

ОБНОВЛЕНИЕ (24 февраля 2013 г.), моя вилка была объединена с багажником. Наслаждаться.

На тот случай, если вы решите написать свой собственный код на C#: я написал кодировщик / декодер PNG с открытым исходным кодом на чистом Java, PNGJ, вы можете найти его полезным; не должно быть трудно портировать на C#. Это всего лишь кодер, а не оптимизатор, но он поддерживает все параметры / стратегии записи (включая различные фильтры для каждой строки), так что вы можете легко подключить к нему свою эвристику.

Обновлено: я закодировал кодировщик / кодировщик PNG на C#, перенесенный из Java ( PngJ), с открытым исходным кодом и, начиная с декабря 2012 года, поддерживает все варианты PNG (за исключением того, что он не пишет чересстрочный PNG, только читает их)

После довольно приличного поиска в Google и недавно обнаружив один или два из этих вопросов в Stackru, я не думаю, что доступна библиотека C#.

Однако OptiPNG - это код на C с открытым исходным кодом, поэтому перенос на C# возможен. В качестве альтернативы вытащите код C в отдельную библиотеку вне exe-файла и вставьте в него P/Invoke.

Похоже, существуют другие библиотеки с открытым исходным кодом, не обязательно специально для оптимизации:

http://www.libpng.org/pub/png/pngcode.html

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

Согласно этому ответу есть несколько.net библиотек, которые можно использовать для оптимизации размера png

Инструменты, которые я использую для оптимизации png:

  1. Конвертировать в png8: если имеется несколько цветов (скажем, скриншотов), тогда я использую [pngnq][2] или режим индексированных цветов Gimp для квантования до 256 цветов. Png8 может быть меньше, чем png24 или png32. Подробнее см. [PNG8 - Чистый победитель] [3].
  2. Optipng, быстрый общий png оптимизатор. [C# PNG Optimization Tutorial][9] содержит подробности о том, как запустить optipng из C#.
  3. Наконец, [pngout][4] работает медленно, но часто (в 80-90% случаев) удается сжать png дальше, чем optipng. Сначала запустите optipng, так как optipng автоматически выполнит другие оптимизации, которые pngout не пытается выполнить.
Другие вопросы по тегам