본문 바로가기
프로그래밍 놀이터/안드로이드, Java

Android RenderScript blur

by 돼지왕 왕돼지 2014. 6. 8.
반응형


 Android RenderScript Blur

 


Android RenderScript blur


RenderScript 관련 API 들은 API 11 에 등장했다.

하지만 Compat library 를 통해 API 8 부터 사용 가능하다.


RenderScript 는 Graphic 작업을 할 때 CPU, GPU 중 해당 작업을 최적으로 처리할 수 있는 것을 찾아내서 multiple processor 작업을 하고 나중에 그 결과를 합치는 작업을 하여 성능을 매우 높인다.


Native syntax 는 C99 기반으로, OpenCL, CUDA, GLSL 등이랑 비슷하다.


< Renderscript Blur Sample Code >

private void blur(Bitmap bg, View textView, float radius) {

    Bitmap overlay = Bitmap.createBitmap( textView.getMeasuredWidth(), textView.getMeasuredHeight(),  Bitmap.Config.ARGB_8888 );

    Canvas canvas = new Canvas( overlay );

    canvas.drawBitmap( bg, -textView.getLeft(), -textView.getTop(), null );

 

    RenderScript rs = RenderScript.create( this );

    Allocation overlayAlloc = Allocation.createFromBitmap( rs, overlay );

    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create( rs, overlayAlloc.getElement() );

    blur.setInput( overlayAlloc );

    blur.setRadius( radius );

    blur.forEach( overlayAlloc );

    overlayAlloc.copyTo( overlay );

 

    textView.setBackground(new BitmapDrawable( getResources(), overlay ) );

    rs.destroy();

}


RenderScript 는 Native memory 를 참조하고 Bitmap 은 heap memory 를 참조한다. ( ICS 이후 )

따라서 이 둘 사이의 memory share 를 위해서 marshal 작업이 필요한데, 이 작업은 Allocation 인스턴스를 통해 된다.

Allocation 은 RenderScript 가 사용하는 Native memory 와 Heap memory 사이의 자동 marshal 작업을 도와준다.


ScriptIntrinsicBlur 는 blur 하는 script 를 로딩하는데 사용된다.


setInput 으로 source bitmap 이 되는 Allocation 을 넣어주고 radius 값을 setting 해준다.

forEach function 은 blur 를 실제로 수행한다.

Allocation.copyTo 를 통해서 작업한 결과물을 다시 Heap memory space 로 복사한다.


마지막으로 background 를 새로 작업한 bitmap 으로 assign 해주고, 

Renderscript 의 context 를 제거한다.






반응형

댓글