バックグラウンド
一部のアプリでは、OOM を使用せずに大きな画像をすばやく処理することが重要です。
このためには、JNI (または悲しいことにドキュメントが不足している renderscript) が優れたソリューションになる可能性があります。
過去に、OOM を回避しながら巨大なビットマップを回転させるために JNI を使用することに成功しました (link here、here、およびhere )。それは素晴らしい(しかし厄介なほど難しい)経験でしたが、最終的にはうまくいきました.
問題
Android フレームワークにはビットマップを処理するための関数がたくさんありますが、JNI 側の状況がどうなっているのかわかりません。
Androidの「Javaワールド」から「JNIワールド」にビットマップを渡したり戻したりする方法はすでに知っています。
私が知らないのは、ビットマップを支援するために JNI 側でどの関数を使用できるかということです。
JNI ですべての画像操作 (デコードを含む) を実行できるようにしたいので、大きな画像が表示されたときに OOM について心配する必要はありません。プロセスの最後に、データを Java に変換できます。ビットマップ(ユーザーに表示するため)および/またはファイルに書き込む。
繰り返しますが、これらの操作を実行できるようにするためだけに、JNI 側のデータを Java ビットマップに変換したくありません。
結局のところ、多くの機能を提供するライブラリ ( JavaCVなど) がいくつかありますが、それらは非常に大きく、それらの機能と、それらが本当に JNI 側でデコードを行うかどうかについてはよくわかりません。代わりに、Android の組み込み JNI 関数を介して何が可能かを知ることができます。
質問
AndroidのJNI側で画像操作に使用できる関数はどれですか?
たとえば、ビットマップで顔検出を実行したり、マトリックスを適用したり、ビットマップをダウンサンプリングしたり、ビットマップをスケーリングしたりするにはどうすればよいでしょうか?
一部の操作については、それらを実装する方法を既に考えています (画像のスケーリングは非常に簡単で、ウィキペディアは大いに役立ちます) が、一部は非常に複雑です。
私が自分で操作を実装したとしても、C/C++ が持つことができる非常に多くの最適化を考えて、他の人がはるかに効率的にそれを作ったかもしれません。
すべてをゼロから実装する必要がある Android の JNI 側に行くとき、私は本当に独力でしょうか?
明確にするために、私が興味を持っているのは次のとおりです。
Java でビットマップを入力 -> 純粋に JNI および C/C++ で画像を操作 (Java オブジェクトへの変換は一切なし) -> Java でビットマップを出力。