фон
В некоторых приложениях важно обрабатывать большие изображения без OOM, а также быстро.
Для этого JNI (или renderscript, который, к сожалению, отсутствует в документации), может быть хорошим решением.
В прошлом мне удалось использовать JNI для вращения огромных растровых изображений, избегая при этом OOM (ссылка здесь, здесь и здесь). это был приятный (но досадно тяжелый) опыт, но в итоге он сработал.
проблема
В андроидном фреймворке есть много функций для обработки растровых изображений, но я не знаю, какова ситуация на стороне JNI.
Я уже знаю, как передать растровое изображение из андроида "java world" в "мир JNI" и обратно.
Что я не знаю, какие функции я могу использовать на стороне JNI, чтобы помочь мне с растровыми изображениями.
Я хочу иметь возможность выполнять все операции с изображениями (включая декодирование) в JNI, поэтому мне не нужно беспокоиться о OOM при представлении больших изображений, и в конце процесса я мог бы преобразовать данные на Java-bitmap (чтобы показать пользователя) и/или записать его в файл.
снова, я не хочу преобразовывать данные на стороне JNI в растровое изображение java, чтобы иметь возможность запускать эти операции.
Как оказалось, есть несколько библиотек, которые предлагают множество функций (например, JavaCV), но они достаточно велики, и я не совсем уверен в их возможностях, и если они действительно делают декодирование на стороне JNI, поэтому я предпочел бы знать, что возможно, используя встроенную функцию JNI для Android.
вопрос
какие функции доступны для обработки изображений на стороне JNI на андроиде?
например, как я могу запускать обнаружение лиц в растровых изображениях, применять матрицы, уменьшенные растровые изображения, масштабные растровые изображения и т.д....?
для некоторых операций я уже могу подумать о способе их реализации (масштабирование изображений довольно простое, а википедия может многое помочь), но некоторые из них очень сложны.
даже если я сам реализую свои действия, возможно, другие сделали это намного эффективнее, думая о том, сколько оптимизаций может иметь C/С++.
Я действительно сам по себе, когда отправляюсь на сторону JNI android, где мне нужно реализовать все с нуля?
просто, чтобы понять, что меня интересует:
входной битмап на java → манипуляция изображениями исключительно в JNI и C/С++ (без преобразования в java-объекты) → вывод растрового изображения на java.