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

[android] 일반적이지 않은 사진(이미지) 모양 만들기 #1 - 모서리가 둥근 사각형

by 돼지왕 왕돼지 2015. 4. 11.
반응형

일반적이지 않은 사진(이미지) 모양 만들기 #1 - 모서리가 둥근 사각형


출처 : http://blog.stylingandroid.com/archives/2656


2가지 이미지를 합성해, 사각형의 이미지를 다른 모양으로 바꿀 수 있다.

이번에 알아볼 것은 모서리가 둥근 사각형을 이용하여, 사각형 이미지를 둥근 사각형 모양으로 masking 하는 것이다.


public Bitmap combineImages(Bitmap bgd, Bitmap fg) {

    Bitmap bmp;

 

    int width = bgd.getWidth() > fg.getWidth() ? 

        bgd.getWidth() : fg.getWidth();

    int height = bgd.getHeight() > fg.getHeight() ? 

        bgd.getHeight() : fg.getHeight();

 

    bmp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

    Paint paint = new Paint();

    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

 

    Canvas canvas = new Canvas(bmp);

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

    canvas.drawBitmap(fg, 0, 0, paint);

 

    return bmp;

}



여기서 bgd 로 오는 bitmap 은 둥근 사각형 모양이며, fg 는 사각형 모양의 일반 사진이다.

PorterDuffXfermode 를 이용하여, Canvas 에 미리 그려진 alpha 가 안 먹은 부분 즉 bgd 위에만

fg 이미지를 그리는 것이다.


PorterDuff.Mode.SRC_ATOP 이 이를 가능하게 하는 옵션이다.


아주 간단하지만 이 방법에는 약점이 있다.


1. bgd, fg 가 이미지 사이즈가 거의 일치해야 한다.

   bgd 나 fg 를 같은 사이즈가 되도록 scaling 을 할 수는 있지만 scale 방법에 따라 결과물이 좀 일그러져 나올 수 있다.


2. 매우 비효율적이다.

  이 효과를 내기 위해서 2개의 이미지를 memory 에 로딩해야 하며, 제 3의 이미지로 생성해 내야 한다.

  이미지 사이즈에 따라 OutOfMemoryError 를 볼 수도 있다.


위의 문제점들이 있지만, 작으면서도 한번정도만 사용하는 경우라면 위의 방법으로도 간단히 대처할 수도 있겠다.

하지만 general 한 방법이 있기에 그 방법은 다음에 알아보도록 하겠다.


다음 글 : http://aroundck.tistory.com/2972








반응형

댓글