Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Однако OptiPNG является открытым кодом C, поэтому портирование на С# является возможностью. Альтернативно, вытащите код C в отдельную библиотеку вне exe и P/Invoke в нее.

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

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

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

Ответ 4

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

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

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