Быстрый способ декодирования изображения в формате JPEG

#android #c #android-ndk #jpeg #libjpeg

#Android #c #android-ndk #jpeg #libjpeg

Вопрос:

Мне нужно декодировать (распаковать в растровое изображение) довольно маленький (около 1200 * 1200) JPEG. Проблема в том, что мне нужно сделать это быстро. Я пробовал libjpeg, и это довольно медленно. Я также пробовал BitmapFactory.decodeByteArray — это немного быстрее, но все же недостаточно быстро. Какие еще варианты? Гораздо предпочтительнее использовать собственную библиотеку (C ).

PS Мои файлы JPEG создаются непосредственно в памяти.

P.P.S. Интересно, почему libjpeg работает медленнее, чем BitmapFactory.decodeByteArray.

Комментарии:

1. С каких пор 1200×1200 «довольно маленький»? Большинство экранов имеют размер всего 320×240 или около того. Черт возьми, мой рабочий стол всего 1280х1024. (1) Уменьшите размер JPEG (2) Декодируйте его только один раз и кэшируйте.

2. Хороший момент, на самом деле 🙂 Я считаю это небольшим, так как я начал работать с зеркалками. И я ориентируюсь на планшеты. Теперь, что касается ваших предложений: 1) Попробовал это (масштабный коэффициент 2) — производительность по-прежнему недостаточна, дальнейшее снижение разрешения неприемлемо. 2) Ни в коем случае, мне нужно отображать разные файлы JPEG в режиме реального времени (более или менее).

3. Что касается разницы в скорости; Код Android, вероятно, будет использовать некоторый набор команд на процессоре ARM для декодирования JPG быстрее, чем код C может использовать CPU.

4. @stealthcopter: Но, насколько я знаю, существует только один такой набор инструкций — NEON, который мое устройство не поддерживает. Единственная возможность, которую я вижу, — это то, что Android использует оптимизированный вручную код, но набор команд ARM — это не совсем тот тип, который вы хотите оптимизировать вручную, и, будучи RISC, он должен быть оптимизирован компилятором довольно хорошо…

5. Re: разница в скорости: платформа может использовать аппаратный декодер JPEG, если SoC имеет такую возможность (например, некоторые Exynos от Samsung имеют ее). К сожалению, нет способа гарантировать, что это аппаратное ускорение будет использоваться фреймворком, даже если оно доступно, и нет способа запустить этот декодер непосредственно на некорневом устройстве.

Ответ №1:

Попробуйте Libjpeg Turbo: http://libjpeg-turbo.virtualgl.org /

Комментарии:

1. Только что попробовал. Скорость точно такая же, как у официального libjpeg, поскольку мое устройство не поддерживает NEON (Tegra 2).