본문 바로가기

무언가 만들기 위한 지식/Java/Android

안드로이드 이미지(사진) 불러오기

정말 오랜만에 써보는 기술쪽 포스팅이군요 ㅠ.ㅜ;
그동안 이것저것 쓸 것은 진짜 많았지만 이전 블로그의 포스팅 이전문제도 있었고, 좀 시간이 걸렸습니다.
뭐 아무튼 그동안 또 공부했던 것들을 깨작깨작 올려보려 합니다.~

구조적인 문제나 심도 있는 긴포스팅 보다는 일단 가볍게 사용에 필요한 코드들을 좀 정리할 예정입니다. ^_^

이번에 이야기할 주제는 간단하게 이미지를 불러올 때입니다.

기본적인 전제는 SD-Card에서 대용량의 사진파일 가져올 때입니다.
보통 SD-Card에서 이미지를 긁어올때, 3메가 이상의 이미지를 읽어 올때 프로그램이 다운됩니다. ㅠ.ㅜ; 그이유를 알고보면 Out Of Memory Error임을 확인할 수 있습니다.

예를들면, 사진첩을 만들때 많은 이미지들을 읽어 와야하는데 일일이 읽어들일 경우에는 당연히 다운되겠죠.
전 경험상 3메가 짜리 이미지 한번 로드 했는데 바로 다운되더군요.

일단 그 해결책이 바로 위의 코드 입니다.
보시게 되면 기본적으로 BitmapFactory 클래스에서 decodeFile함수를 이용하여 비트맵 객체를 생성하는 모습을 볼 수 있습니다.
다들 아시겠지만 decodeFile은 따라가보면 static으로 설계되어 있기 때문에 저렇게 쓰는것 입니다.

decodeFile 함수를 사용할때, Options을 지정해주는데, BitmapFactory.Options Class를 이용합니다. 이것은 Class가 통째로 static으로 구성되어 있습니다. 그 내부적으로 변수들이 여러종류가 제공되는 모습을 볼 수 있습니다.
SDK Referece Link : http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html

여러 옵션중에서 inSampleSize라는 것을 만들어 넣었습니다. 이 의미는 샘플 사이즈를 1/8배 축소한다는 의미입니다.
이렇게 샘플싸이즈옵션을 지정해 준다면, 비트맵을 생성할때, inSampleSize만큼 줄여진 Bitmap을 로드하기 때문에 부하에도 걸리지 않고 빠르게 처리됩니다.

createScaledBitmap에서는 로드한 Bitmap 객체를 특정 크기로 자르기 위할때 사용됩니다.
(decodeFile할때 특정의 배수로 sampleSize를 정할 수 있기 때문에 정확한 width와 height를 위해서는 createScaledBitmap을 사용한다.

이와 관련하여 정말 자세하게 비즈페이님이 설명해 주셨다.
비즈페이님의 네이버 블로그 : http://blog.naver.com/visualc98/79874750
(이외에도 자세하고 친절한 설명으로 되어있다.~)