안드로이드에서 이미지를 라운드 처리하는 방법

안드로이드 개발 시 이미지의 라운드 처리를 하는 경우가 많다.  여기에는 크게 두 가지 방법이 있는데, 하나는 원본 이미지 위에 마스킹 이미지를 올려 보이는 부분을 라운드 처리하는 것이고, 다른 하나는 이미지의 모서리를 프로그래밍으로 라운드 처리하는 것이다.

먼저 프로그래밍으로 라운드 처리하는 예제를 보자. 안드로이드에서는 RoundedBitmapDrawable 클래스를 통해 이를 지원하며, 둥글게 깎았을 때 계단 현상을 줄이기 위해 안티앨리어스도 옵션도 지원한다.

private Bitmap getMaskedBitmap(int _srcResId, float _roundInPixel)
{
    Bitmap srcBitmap = BitmapFactory.decodeResource( getResources(), _srcResId);

    RoundedBitmapDrawable roundedDrawable =
                       RoundedBitmapDrawableFactory.create(getResources(), srcBitmap);

    roundedDrawable.setCornerRadius( _roundInPixel );
    roundedDrawable.setAntiAlias(true);

    return roundedDrawable.getBitmap();
}

인터넷에 이미지에 마스킹을 적용하는 예제는 많다. 여기서는 나인패치 이미지를 마스크로 사용해 라운드 처리하는 것을 살펴보자.

안드로이드에서는 나인패치를 이용해 마스킹 처리를 하는 경우도 지원하고 있다. NinePatch 클래스와 NinePatchDrawable 클래스를 이용하면 되는데, 먼저 NinePatch 클래스를 이용해 비트맵(Bitmap) 이미지를 라운드 처리하는 경우를 살펴보자.

@SuppressLint("NewApi")
private Bitmap getMaskedBitmap( Bitmap _srcBitmap, Bitmap _maskBitmap)
{
    Canvas canvas = new Canvas();

    Paint paint = new Paint();
    paint.setFilterBitmap(false);

    NinePatch ninePatch =
               new NinePatch(_maskBitmap, _maskBitmap.getNinePatchChunk());

    Bitmap result = Bitmap.createBitmap(_srcBitmap.getWidth(),
                                        _srcBitmap.getHeight(),
                                        Bitmap.Config.ARGB_8888);

    canvas.setBitmap(result);
    canvas.drawBitmap(_srcBitmap, 0, 0, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    ninePatch.draw(canvas,
            new Rect(0, 0, _srcBitmap.getWidth(), _srcBitmap.getHeight()),
            paint);

    paint.setXfermode(null);

    return result;
}

다음은 NinePatchDrawable 클래스를 이용해 드로우어블(Drawable) 객체를 라운드 처리하는 경우다.

@SuppressLint("NewApi")
private Bitmap getMaskedBitmap( int _srcResId, int _maskResId )
{
    Canvas canvas = new Canvas();

    Paint paint = new Paint();
    paint.setFilterBitmap(false);

    NinePatchDrawable drawable =
          (NinePatchDrawable) getResources().getDrawable(_maskResId, null);

    Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), _srcResId);

    Bitmap result = Bitmap.createBitmap(
            srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888);

    canvas.setBitmap( result );
    canvas.drawBitmap(srcBitmap, 0, 0, paint);

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    drawable.draw( canvas );

    paint.setXfermode( null );

    return result;

}

마스킹 이미지를 사용하는 위 두가지 방법 모두 캔버스(canvas)에 비트맵 이미지를 그리는 방식으로 만드는 면에서 비슷하다.

그 밖에

이미지의 모서리를 일괄적으로 라운드처리하는 경우라면, RoundedBitmapDrawable를 사용하자. 개인적으로 갤럭시 S6에서 테스트한 결과 RoundedBitmapDrawable이 마스크 이미지보다 최소 5배 이상 빨랐다.

단, 단순한 라운딩 처리가 아닌 특별한 모양으로 처리해야한다면 마스크 이미지가 더 편할 것이다. 5배의 속도차이라고 하지만, 모두 수 밀리초 정도 내에 끝나기 때문에 성능을 위해 기능을 포기할 정도는 아니다.

참조

“안드로이드에서 이미지를 라운드 처리하는 방법”에 대한 1개의 생각

  1. 핑백: 나인패치의 비밀 | Dog발자

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.