미리 말해두자면 여긴 완벽한 코드를 올리는 곳이 아니다. 그저 '아..그래서 저 코드를 쓴거구나' 정도만 이해했으면 하는 바람으로 글을 쓰는 것이다. 실제 사례라든지 소스코드는 깃허브나 스텍오버플로우 등에 가서 받길 바란다.
BitmapFactory는 각종 디코딩 메소드를 제공함. 디코딩이란게 뭐냐면..2진수나 뭐 어떠한 압축된 형태로 저장되어 있는 녀석을 원래로 복원시켜주는게 디코딩이다.
decodeByteArray(), decodeFile() 등 여러가지 디코딩 메소드들이 있는데 내가 가진 다양한 형태의 소스에 따라 알맞는 디코딩 메소드를 사용하면 된다.
일단 bitmap을 디코딩 해봤으면 알겠지만..이미지..사진..이라는게 상당히 큰 용량을 자랑한다. 크기도 1024x768을 기본으로 할정도로...컴퓨터에서나 휙휙 보여줄 용량과 크기를 가진 사진을 핸드폰에서 빠르게 보여주려고 했으니...에러가 나는게 어찌보면 당연하다. 그중에 컴파일 하다보면 가장 눈에 띄는 에러는 out of Memory다. 즉, 너무 커서 메모리 초과라는 뜻이다. 그럼 일단 효과적으로 이걸 막을 수 있는 방법부터 설명하고자 한다.
차를 산다고 생각해 보자. 뜬금없이 왜 차 얘기를 하나 할테지만...차를 살 때 옵션이란게 있다. 실내 시트를 가죽으로 할지, 바퀴를 뭘로 할지, 도색을 어떻게 할지.. 등등..이런게 옵션인데..디코딩을 할 때도 옵션이 있다. 디코딩 시 사이즈를 어떻게 할지, 어디에 있는 녀석들을 불러올지, 불러올 화면의 크기가 어떤지.. 등등..이런게 다 옵션이다.
이클립스나 안드로이드 스튜디오에 BitmapFactory BF=new BitmapFactory(); 라고 띡 선언하는건 인간적인 생각이고...사실 컴퓨터는 바보이기때문에 일일이 옵션을 지정해줘야 한다. 자 이제 코드를 보도록 하자.
1 2 3 4 5 6 7 8 9 10 11 | //위에 설명했다시피 왜 options을 생성해야하는지 알았을 것이다. BitmapFactory.Options options = new BitmapFactory.Options(); //inJustDecodeBounds 가 true면 디코딩 중에는 메모리 할당을 피한다. 즉 out of Memory를 일단 봉쇄! options.inJustDecodeBounds = true; //이 코드에서는 디코드를 리소스 가지고 했는데 다른걸로 할 수 있다는 것을 위해서 설명했다. BitmapFactory.decodeResource(getResources(), R.id.myimage, options); //위에 글에서 설명했듯이 마치 안드로이드 프로그램이 다 알아서 설정해줄 것 같지만..그건 인간들의 꿈이고.. //컴퓨터는 바보이기때문에 일일이 하나씩 하나씩 모두 다 설정해줘야한다. 그렇게 생각하는게 프로그래밍 할때 편하다. int imageHeight = options.outHeight; int imageWidth = options.outWidth; String imageType = options.outMimeType; |
bitmap의 용량,크기 등이 메모리에 딱 맞게 설정되어있지 않다면, 무조건 일일이 지정해주자. 그것만이 outofMemory를 피할 수 있는 길이다.