본문 바로가기

Programming/Android

[Android] 해상도에 따른 비트맵 리사이즈

문제1
어플을 처음 시작할 때 뜨는 로고 이미지를 배치하는데에 있어서 문제가 있었다. 다양한 해상도의 기기에서 뭉개지거나 깨지지 않은 이미지를 출력해 주는 것이 목표였는데 기본 XML기반의 레이아웃 설계로는 한계가 있었다.

1) 해결
이러한 문제를 해결하기 위해 결국 프로그래밍으로 레이아웃을 구성하기로 하였다.

프로그램이 시작할 시 기기의 해상도를 구해 이미지를 리사이즈 하여 출력한다.

2) 코드

Bitmap logo = null;
int width = this.getResources().getDisplayMetrics().widthPixels; // 기기의 가로 크기
Bitmap temp = BitmapFactory.decodeResource(getResources(), R.drawable.back);
int img_width = temp.getWidth(); // 변환할 이미지의 가로
int img_height = temp.getHeight();  // 변환할 이미지의 세로

float di = (float)img_width / (float)width; // 배수 계산
int height = (int)((float)img_height / di); // 새로운 이미지의 세로 계산

logo = Bitmap.createScaledBitmap(temp, width, height, true);    // 이미지 리사이즈


문제2

이미지를 기기에 맞게 리사이즈 함으로써 다양한 해상도에서 로고 이미지를 깔끔하게 표현할 수 있었지만 프로그램을 실행할 때마다 매번 이미지를 리사이즈 하다 보니 초기 구동 시간이 느려지는 문제가 발생하였다.

해결
이 문제를 해결하기 위해 어플리케이션을 처음 실행할 때만 이미지를 리사이즈 하여 이를 파일로 저장한 후, 그 이후부터는 기존에 저장한 이미지를 불러와 출력한다.

코드
// 비트맵저장
FileOutputStream fos = openFileOutput("logo.png", 0);
logo.compress(CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();

// 비트맵로드
String img_path = "data/data/com.test.contact/files/logo.png";
logo = BitmapFactory.decodeFile(img_path);로 저장