私はついに適切な解決策を見つけました:
- RenderScriptを使用すると、実行デバイスで使用可能なすべてのコアに対して透過的にスケーリングされる大量の計算を実装できます。パフォーマンスと実装の複雑さの合理的なバランスに関して、これはJNIやシェーダーよりも優れたアプローチであるという結論に達しました。
- APIレベル17以降、APIから利用できるScriptIntrinsicBlurクラスがあります。これはまさに私が探していたものです。つまり、高レベルのハードウェアアクセラレーションによるガウスぼかしの実装です。
- ScriptIntrinsicBlurは、Froyo以降(API> 8)をサポートするAndroidサポートライブラリ(v8)の一部になりました。サポートRenderScriptライブラリに関するAndroid開発者のブログ投稿には、その使用方法に関するいくつかの基本的なヒントがあります。
ただし、ScriptIntrinsicBlur
クラスに関するドキュメントは非常にまれであり、正しい呼び出し引数を理解するためにもう少し時間を費やしました。、という名前の通常の型のARGB_8888
ビットマップをぼかすためphoto
に、ここにそれらがあります:
final RenderScript rs = RenderScript.create( myAndroidContext );
final Allocation input = Allocation.createFromBitmap( rs, photo, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT );
final Allocation output = Allocation.createTyped( rs, input.getType() );
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create( rs, Element.U8_4( rs ) );
script.setRadius( myBlurRadius /* e.g. 3.f */ );
script.setInput( input );
script.forEach( output );
output.copyTo( photo );