본문 바로가기

안드로이드/자바

[안드로이드/Android] 이미지 리사이즈

반응형

 

안녕하세요 이번 포스팅은 이미지(Bitmap) 리사이즈 입니다.

핸드폰의 이미지는 점점 더 고해상도로 변해가고 있고, 그로인해 이미지의 용량이 커지므로 일부 사진을 표현하는 앱에서는 Out of Memory가 발생합니다. 해당 에러를 피하기 위해서는 이미지 리사이즈는 필수 입니다.




이미지를 가져오는 방법은 아래 포스팅을 이용해주세요

[안드로이드/Android] 카메라와 갤러리에서 사진 가져오기




SampleSize를 이용한 리사이즈


해당 포스팅은 원본 사진의 화질을 최대한 해치지 않고 리사이즈합니다.

아래 메소드를 그대로 복사하셔서 사용하면 됩니다.

private Bitmap resize(Context context,Uri uri,int resize){
Bitmap resizeBitmap=null;

BitmapFactory.Options options = new BitmapFactory.Options();
try {
BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri), null, options); // 1번

int width = options.outWidth;
int height = options.outHeight;
int samplesize = 1;

while (true) {//2번
if (width / 2 < resize || height / 2 < resize)
break;
width /= 2;
height /= 2;
samplesize *= 2;
}

options.inSampleSize = samplesize;
Bitmap bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri), null, options); //3번
        resizeBitmap=bitmap;

} catch (FileNotFoundException e) {
e.printStackTrace();
}
return resizeBitmap;
}

1번


uri는 선택한 이미지의 uri입니다.  

1번을 수행함으로써 options의 이미지의 넓이,높이,샘플사이즈 값이 입력되는데, 여기서 샘플사이즈는 한 픽셀당 표현하는 픽셀수입니다.

해당 포스팅의 핵심 키워드로 샘플사이즈의 숫자를 높일수록 한 픽셀안에 표현하는 픽셀수가 많아짐으로써 이미지의 크기가 작아집니다.

예를 들어 샘플사이즈가 '4' 인 경우 4개의 픽셀을 1개의 픽셀에 표현하므로 이미지 크기는 1/4로 작아집니다.



2번


인자값으로 받은 resize는 원하는 이미지 리사이즈 크기 입니다. '500' 을 인자값으로 받았다면 이미지가 500에 가장 가깝게 줄입니다. 

예를들어 원본 이미지의 넓이가 3000, 높이가 1000일 경우 2번을 수행하면 넓이는 1500, 높이는 1000, 샘플사이즈는 2입니다. 

원하는 값으로 무조건 리사이즈하는게 아니라, 근사치로 줄입니다. 그 과정에서 샘플사이즈는 2배씩 커지게 되는데 그 이유는 샘플사이즈가 2배수만을 인식하기 때문입니다.



3번


2번으로 인해 정해진 샘플 사이즈로 리사이즈해서 비트맵으로 만듭니다.



해당 메소드로 리사이즈된 이미지의 넓이와 높이를 보면 핸드폰을 가로로 놓고 찍은 사진은 넓이가 넓고, 세로로 놓고 찍은 사진은 높이가 높기때문에 같은 이미지로 2번에서 넓이와 높이가 원하는 사이즈보다 작아지기 전까지 수행합니다.

그래야 이미지의 원본 화질을 최대한 보존할 수 있습니다. ( 본래 크기보다 억지로 늘릴려고 한다면 사진은 깨집니다. ) 




해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다. 





반응형