마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

비트맵 이미지 리사이징!!

0 추천
    public Bitmap decodeSampledBitmapFromIs(InputStream is,
                                            int reqWidth, int reqHeight) {
 
        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(is, null, options);
 
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        Log.i("decodeFromIs: ", "width " + reqWidth + " height " + reqHeight + " inSampleSize : " + options.inSampleSize);
 
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        Bitmap b = BitmapFactory.decodeStream(is, null, options);
        return b;
    }
 
위와 같은 소스가 있습니다.
출처는
여기 구요! 
 
출처에선 Resource로 하였으나 저는 외부에서 받아오는 이미지라서 InputStream으로 재구현하였습니다.
 
위 함수의 과정을 요약하면
이미지 크기 정보 받아오기 -> 이미지 크기에 따른 InSampleSize 값 -> 정해진 옵션으로 이미지 디코드 -> 비트맵 반환
입니다.
 
근데 이미지가 안떠요.. 아래 두줄을 지우면 잘 뜹니다.
options.inJustDecodeBounds = true; //이미지를 decode할 때 이미지의크기정보만 가져와서 OOM이 발생하지 않음. 
BitmapFactory.decodeStream(is, null, options); //이 과정에서 options.width와height가 구해집니다.

하지만 저걸 지우면 유동적인 InSampleSize를 구할수 없어집니다...ㅠㅠㅠㅠㅠㅠ

원인이 뭘까요 왜, 저 두줄을 지우면 잘될까요,,
InputStream의 어떠한 특성이 있는건지..... 삽질끝에 질문올립니다 ㅠ
 
cmsypub (820 포인트) 님이 2015년 7월 16일 질문

2개의 답변

+2 추천
options.inJustDecodeBounds = true; 은 이미지를 직접 디코딩하지 않고 경계영역만을 구하겠다는 의미입니다. (온라인상의 비트스트림을 실제 화일처럼 어떻게 컨트럴 해야하는지에 대한 부분이 BitmapFactory에 정의 되어 있을 것 같지는 않군요. 그래서 아마 원하는 동작이 이루어지지 않는 겉 같습니다. )

따라서 이미지의 크기를 구하는 부분과 실제 이미지를 구하는 부분을 별개로 분리하시면 가능하지 않을까 생각됩니다.

즉 inputstream를 사이즈 구하는 부분하시 닫으시고, 그리고 실이미지를 리사이즈해서 얻는부분을 하실때 다시 여서서 새로운 inputstream을 만드시면 어떨까요?
컴러기 (22,230 포인트) 님이 2015년 7월 16일 답변
0 추천
picasso 라는 이미지 라이브러리를 써보세요
쎄미 (162,410 포인트) 님이 2015년 7월 16일 답변
...