본문 바로가기

Android/Bitmap alpha

안드로이드 비트맵 알파 마스크 적용 예제

SurfaceView.onDraw(Canvas canvas) 안에서 알파 마스킹을 적용하는 예

소스코드 

alpha_mask.zip


사용된 배경 이미지(mountain.jpg)                     알파 마스킹 이미지(alpha_mask.png, 흰색 타원은 투명하게 처리된 영역)

  


Canvas에 배경 이미지를 먼저 그리고 그 위에 마스킹 이미지를 그린다.


마스킹 이미지를 그릴 때 모드 설정은 다양하게 할 수 있지만 여기서는 2가지를 테스트한다.PorterDuff 모드 설정을  PorterDuff.Mode.DST_OUT, PorterDuff.Mode.DST_IN으로 적용해보면 다음과 같은 차이점을 확인할 수 있다.


PorterDuff.Mode.DST_OUT 으로 설정한 경우 출력화면                   PorterDuff.Mode.DST_IN 으로 설정한 경우 출력화면


위의 결과를 게임 등에서도 응용할 수 있을 것이다. 예를 들어, DST_IN으로 설정한 효과는 이미지의 일부 영역을 투명하게 하여 먼 곳에 있는 배경을 볼 수 있게 되므로 포탄 등에 의해 일부가 파괴된 지형지물을 표현할 때 유용하게 사용할 수 있을 것이다.


SurfaceView.onDraw()

@Override

protected void onDraw(Canvas canvas) {

canvas.drawColor(Color.CYAN);

Canvas c = new Canvas();

        Bitmap mainImage = BitmapFactory.decodeResource(getResources(),R.drawable.mountain);

        Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.alpha_mask);

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

        

        c.setBitmap(result);


        c.drawBitmap(mainImage, 0, 0, null);

        

        Paint paint = new Paint();

        paint.setFilterBitmap(false);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN) ); // DST_OUT


        c.drawBitmap(mask, 0, 0, paint);

        

        paint.setXfermode(null);

        canvas.drawBitmap(result, 0, 0, null);

}