본문 바로가기
개발/android

이미지를 싹뚝 자를때 꼭 알아야 할 비밀

by 매몰 2015. 10. 26.

이미지를 전체가 아닌 일부분만 출력하고 싶을때 사용하는 기법이 Image Clipping 이다.

게임을 만들때는 없어서는 안되는 아주 고마운 녀석이다.

 

보통 Clipper 객체를 만들어 사용하는데...

어렸을때는 왜 굳이 객체까지 만들어서 이미지를 자르나.. 그냥 자르면 되지..

라며 쓸데 없는것이라고 생각했었다.

 

하지만 어른이 되고 개발을 업으로 살다보니 조상님들의 지혜에 감탄하듯 

그 이유를 깨닫게 되었다ㅎㅎ

 

아주 단순하고 지극히 당연하지만... 그래서 간과하기 쉬운 클리핑의 원리!

비밀 아닌 비밀같은 클리핑을 알아보자~

 

클리핑 좌표

 

 

위 그림처럼 클리핑은 이미지 원본크기와 출력크기가 다르다는 것이 문제이다.

또 원본좌표는 (0, 0)에서 시작되지만 출력좌료는 스크린좌표가 더해진다.

 

이것을 같은 크기와 좌표로 작업할 수 있도록 해주는것이 클리핑 객체의 역활이다.

 

즉, 이미지마다 모두 크기가 다를수 있기 때문에 이미지 하나당 클리핑 객체도 하나씩 두면 편리하게 사용할 수 있다.

 

자 이제 코드로 옮겨 보자~

 

 

public class Clipper {

public Rect mRect, mOutRect;
private int mImageWidth, mImageHeight;

public Clipper(Bitmap image, Rect outrect) {
if (image != null && !image.isRecycled()) {
//이미지 크기
mImageWidth = image.getWidth();
mImageHeight = image.getHeight();
}

//출력 좌표
mOutRect = outrect;

//클리핑 좌표
mRect = new Rect(0, 0, mImageWidth, mImageHeight);
}

//원본 좌표를 기준으로 자르기
public void setRect(float left, float top, float right, float bottom) {
//이미지 크기와 출력 좌표의 크기 비율을 계산
float widthrate = mImageWidth / (float)mOutRect.width();
float heightrate = mImageHeight / (float)mOutRect.height();

//계산된 비율로 클리핑 좌표 설정
mRect.set((int)(left * widthrate), (int)(top * heightrate), (int)(right * widthrate), (int)(bottom * heightrate));
}

//출력 좌표를 기준으로 자르기
public void setRectForOut(float left, float top, float right, float bottom) {
//출력 좌표
float x = mOutRect.left;
float y = mOutRect.top;

//원본 좌표에 출력 좌표를 적용
setRect(left - x, top - y, right - x, bottom - y);
}
}

 

 

클리퍼 클래스가 만들어졌으니 객체에 비밀을 숨긴 채 사용을 해보자~

 

Bitmap bitmap = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.kkwalla);

//좌표는 출력좌표 기준으로~ 원본좌표를 신경쓸 필요가 없다~

Rect rect = new Rect(200, 500, 400, 700);
Clipper clipper = new Clipper(bitmap, rect);

clipper.setRectForOut(300, 500, 400, 600);

canvas.drawBitmap(bitmap, clipper.mRect, rect, null);

 

 

 

사업자 정보 표시
주식회사 머리말 | 고영진 | 서울특별시 송파구 중대로 135 서관 10층 (가락동, 아이티벤처타워) | 사업자 등록번호 : 524-88-00727 | TEL : 010-9990-3674 | Mail : gyjmeba@hanmail.net | 통신판매신고번호 : 2017-서울강남-03941호 | 사이버몰의 이용약관 바로가기