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