woong's

Android 대용량 이미지 처리 본문

Develop/Android

Android 대용량 이미지 처리

dlsdnd345 2016. 2. 14. 17:02
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Android 대용량 이미지 처리





안녕하세요 . Android 대용량 이미지 처리에 관하여 포스트를 작성해보려 합니다 .


HelloWorld 앱 메모리 최적화 

 

위 링크를 참고하시면 도움이 될것 같습니다 .


예를 들어 이미지 용량이 3메가 입니다 .

3메가짜리 이미지를 로드하면 보통 디바이스에서는 Out Of Memory 에러를 나타 냅니다 .


이미지를 로드하는데 메모리가 부족하여 나타나는 이미지 입니다 .


이런경우에는 이미지를 리사이즈 하는 방법이 있습니다 .


1
2
3
4
5
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
bitmapImage = BitmapFactory.decodeResource(getResources(), image, options);
ImageView imageView = (ImageView)findViewById(R.id.image);
imageView.setImageBitmap(bitmapImage);

 

 

이미지 리사이즈 방법입니다 .


보통 이렇게 진행하면 왠만한 이미지 처리는 Out Of Memory 가 일어나지 않고 부드럽게 처리 할수 있습니다 .

제가 3메가 짜리 이미지 20개 리사이즈를 하여 Pager 처리 해보니 부드럽게 나타나는것 같습니다 .


사진은 리사이즈해도 해상도가 눈에 구별이 가지 않을정도 입니다 .

하지만 예를 들어서 도면이라고 생각해보면 어떨까요 ... ??


선들이 아마 깨지거라 생각합니다 . 또는 이미지 리사이즈를 하면 안되는 경우가 있죠 .


그경우에는 InputStream 을 통해서 처리 해보았습니다 .


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    class ImageAsyncTask extends AsyncTask<Void, Void, Bitmap> {
 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);
        }
 
        @Override
        protected Bitmap doInBackground(Void... params) {
            InputStream is = getResources().openRawResource(image);
            return BitmapFactory.decodeStream(is);
        }
 
        @Override
        protected void onPostExecute(Bitmap result) {
            super.onPostExecute(result);
            progressBar.setVisibility(View.INVISIBLE);
            imageView.setImageBitmap(result);
        }
 
    }

 

 

InputStream 을 통해서 대용량 이미지 파일을 받아와서 Bitmap 으로 변환합니다 .

이작업은 쓰레드를 통해서 진행하셔야 합니다 .

main Thread 는 UI 를 관장하고 File 이나 , Download 등 시간이 오래걸리는것은 Thread 를 

통해서 비동기 처리해야 부드러운 UI 를 제공할수 있습니다 .



InputStream is = getResources().openRawResource(image);

return BitmapFactory.decodeStream(is);


위코드가 핵심 코드입니다 .


이와 같이 처리를 하면 이미지 리사이즈 하는 것보다 퍼포먼스는 조금 떨어지는것 같습니다 .

그래도 사용자가 사용할만큼의 퍼포먼스는 나타나는것 같습니다 .


필히 이미지 리사이즈가 되지않는경우는 이와같이 진행하는것도 괜찮을거 같습니다 .


Comments