#java #graphics #compression #png #javax.imageio
#java #графика #сжатие #png #javax.imageio
Вопрос:
В настоящее время я работаю над собственной реализацией фильтра PNG. Я использую нейронную сеть, чтобы попытаться создать лучшее предсказание, чем текущие существующие фильтры PNG:
- 0 — Нет
- 1 — Sub
- 2 — Up
- 3 — Среднее
- 4 — Paeth
- 5 — Моя реализация (с предсказанием нейронной сети)
Для получения дополнительной информации: http://www.w3.org/TR/PNG/#9Filters
Я уже просмотрел несколько библиотек:
- pngcrush (реализован на c ..)
- Ключевая точка — PNGEncoder (мой текущий фаворит)
- ObjectPlanet — PNGEncoder (я должен заплатить 1000 $ за src .. :P)
Есть еще несколько вариантов. Но теперь мой вопрос в том, знаете ли вы какие-нибудь другие PNG-кодеры (написанные на Java), где легко можно добавить собственную реализацию фильтра или есть какие-либо другие возможности использовать мой собственный фильтр?
Большое спасибо за ваши ответы!
Ответ №1:
Некоторое время назад я создал небольшую библиотеку pure Java PNG (encoder-декодер)
http://code.google.com/p/pngj/
Он небольшой, довольно полный (не полностью), у него нет зависимостей от сторонних библиотек, а код доступен (и, я надеюсь, прост для понимания). Вы можете покопаться там, если хотите реализовать пользовательский фильтр. Если вам нужна помощь, вы можете обратиться ко мне.
Но имейте в виду, что (как указано в другом ответе) Стандарт PNG не поддерживает пользовательские фильтры, только вы сможете прочитать ваши закодированные изображения.
Комментарии:
1. Спасибо. Это то, что я искал. Я посмотрел на код, реализовать там мой фильтр не должно быть так сложно. Да, как упоминалось ранее, это только для небольшого исследовательского проекта, и все в порядке, когда я единственный, кто может прочитать эти закодированные изображения :).
2. Я просто хочу еще раз поблагодарить вас за предоставление мне вашего кодера / декодера. Я адаптировал вашу версию с помощью 8-разрядной реализации в оттенках серого и смог успешно реализовать свой фильтр нейронной сети! Единственной проблемой, с которой я столкнулся, был перевод комментариев на испанский:P Если вас заинтересовал мой проект, вы можете проверить мой пост в блоге prineblog.wordpress.com/2011/06/21 /…
3. @Prine: Рад, что вы нашли это полезным, и сожалею о комментариях на испанском 🙂 Тем временем я загрузил несколько новых версий библиотеки с более подробными комментариями и документами.
4. Я хотел бы поблагодарить вас, aswel, за вашу библиотеку. Это работает как шарм, как раз то, что мне было нужно!
Ответ №2:
Это не ответ на вопрос, а скорее «так не получится».
Связанный вами раздел спецификации PNG определяет метод фильтрации 0 и список типов фильтров (функций) для этого метода. Этот список исправлен:
Метод фильтра 0 определяет именно этот набор из пяти типов фильтров, и он не должен расширяться. Это гарантирует, что декодерам не нужно распаковывать данные, чтобы определить, содержат ли они неподдерживаемые типы фильтров: достаточно проверить метод filter в IHDR.
Итак, вы не можете просто добавить сюда свое предсказание нейронной сети.
Что вы могли бы сделать, так это создать новый метод фильтрации (метод 1 или подобный — см. Раздел 4.9), который затем может включать ваш тип фильтра нейронной сети.
Но проблема в том, что тогда каждое программное обеспечение, которое захотело бы прочитать PNG, созданные вашим программным обеспечением, также должно было бы поддерживать этот новый метод фильтрации. Итак, если вы не хотите делать это просто для вашего внутреннего хранилища изображений, это не то, что полезно делать.
Где вы действительно могли бы использовать свою нейронную сеть, так это для выбора правильного типа фильтра (из пяти приведенных) для каждой строки сканирования, чтобы результирующий сжатый поток данных был как можно меньше (или эффективен, или …).
Комментарии:
1. Привет, Пауло! Большое вам спасибо за ваш ответ. Это действительно хороший момент. Но я делаю это в качестве исследовательского проекта в моем университете, и «пока» не планируется использовать этот фильтр в производственной среде. Но то, что я хочу сделать, это небольшое исследование, можно ли оптимизировать сжатие с помощью предсказателя нейронной сети. Для этого мне действительно не нужен декодер. Или я что-то неправильно интерпретирую? (Тем временем я нашел еще один интересный PNGEncoder на Java: docjar.com/docs/api/nextapp/echoservlet/image/PngEncoder.html )
2. Вы можете сжать что угодно до нуля, если вам не нужно распаковывать это впоследствии:-p . Итак, вы должны, по крайней мере, включить способ декодирования ваших собственных данных, даже если вы не хотите, чтобы они были доступны для декодирования публично. Это также означало бы исправление загрузочной части библиотеки PNG.
3. И извините, что я действительно не могу помочь вам с вашим реальным ответом, поскольку я вообще не знаю никаких библиотек PNG.
4. Да, это правда. Я должен написать декодер. В противном случае это действительно не имеет смысла.. Да, никаких проблем, и в любом случае спасибо за ваш ответ!
5. @Prine: Вы здесь путаете меня с leonbloy? Я, конечно же, не писал PNG-кодировщик или декодер и вообще не использую комментарии на испанском (поскольку я на этом тоже не говорю).