Библиотека кодирования изображений - PullRequest
0 голосов
/ 23 марта 2010

Есть ли какая-нибудь хорошая библиотека для кодирования / декодирования без потерь изображений, которая имеет степень сжатия более или менее похожую на PNG, но декодирование в необработанные растровые данные RGB будет намного быстрее, чем PNG?

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

Оригинальная проблема заключается в медленном чтении и декодировании файлов PNG на iPhone с использованием стандартных библиотек. Очевидным и самым простым решением было бы хранить необработанные растровые данные RGB, но тогда размер распакованного ipa слишком велик - в 4 раза больше, чем файлов PNG. Итак, я пытаюсь найти какое-то компромиссное решение.

Ответы [ 5 ]

1 голос
/ 24 марта 2010

Пока вам не нужно сжимать на iPhone, декодирование Lempel-Ziv довольно быстрое. Однако получится ли хорошее сжатие - это другой вопрос. Ваш первый шаг должен состоять в том, чтобы выгрузить изображение в формате ppm и сжать его до gzip. Я пробовал это на нескольких снимках экрана SO, и, поскольку количество цветов относительно невелико, полученные файлы имеют примерно тот же размер, что и PNG (немного меньше). Тест

pngtopnm so.png | gzip -v9 | wc -c

Если этот тест производит что-то достаточно маленькое для вашего приложения, вы можете пойти & mdash; просто запустить gzip для необработанных растровых изображений и использовать крошечный фактический декодер libz в своем приложении для iPhone. Если это не так достаточно быстро, вы можете попробовать еще более быстрые декодеры на основе Lempel-Ziv.

Если ваши изображения имеют много цветов, и это не очень хорошо работает, вы можете рассмотреть какую-либо форму сжатия с потерями.

1 голос
/ 23 марта 2010

Почему бы просто не использовать исходные необработанные данные RGB (A), сжать и распаковать их с помощью zip, RLE, huffman и т. Д.

0 голосов
/ 10 июня 2011

Ваши лучшие быстрые и грязные результаты будут получены при использовании 7zip SDK для декодирования необработанных данных изображения, которые были отформатированы как ABGR (little-endian). Затем вы можете перетащить эти данные изображения на экран с помощью UIKit API. Если вы хотите взглянуть на пример кода iOS, выполните поиск Google в «AVAnimator iOS», и вы найдете библиотеку с открытым исходным кодом, которая реализует этот подход. Главное, что вам нужно сделать, это убедиться, что каждый пиксель графических данных уже отформатирован оптимальным образом для iOS, это в основном то, что делает xcode, когда он готовит PNG-файлы для использования в проекте iOS.

0 голосов
/ 26 марта 2010

PNG-сжатие - это базовое предсказание (соседние пиксели), за которым следует сжатие Zip. Если вам действительно нужно сжатие без потерь с низкими требованиями к памяти и процессору, эту стратегию сложно превзойти ... полагая, что у вас есть приличная библиотека для создания PNG. Узким местом кодирования является сжатие почтового индекса. (И, как указал другой, имейте в виду, что декодирование происходит намного быстрее, чем кодирование). Просто заархивировать необработанное изображение было бы лишь незначительно быстрее и (за исключением очень специфических изображений) достичь гораздо более низкой эффективности сжатия.

0 голосов
/ 23 марта 2010

Если ваши изображения не ограничены конкретной проблемной областью (например, сгенерированные компьютером снимки экрана), где индивидуальное решение может удовлетворить как степень сжатия, так и скорость декодирования, это, как правило, компромисс, когда вам придется выбирать между одним или другой.

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

Вы можете использовать какое-то программное решение, которое «скрывает» медлительность от пользователя, лениво загружая изображения в отдельный поток.

...