2012-11-07 2 views
2

큰 이미지를지도로 사용해야하는 프로젝트 작업 중입니다. 이미지는 약 95MB이고 해상도는 12100 x 8000 픽셀입니다.Android : 큰 이미지의 세부 정보 만로드

나는 전체 이미지를 한 번에 필요로하지 않고, 단지 1000 x 1000 픽셀의 디테일이 필요하다. (항상 똑같은 부분이 아니라, 똑같은 부분을 잡아 내면 사용할 수있는 해결책이 아니다.) 그래서 그냥 BitmapOptions으로 샘플링 할 수는 없습니다.

나는 주위를 돌아보고 FileInputStream (이미지는 SD 카드에 있음)을 만들고 나서 decodeStream(InputStream is, Rect outPadding, BitmapFactory.Options opts)이라는 세부 정보를로드 할 수 있다는 것을 알았습니다. 그렇게하면 모든 것을 메모리에로드하지 않습니다. 해봤지만 이미지를로드하려고하면 충돌이 발생합니다. 내가 이미지를로드 할 때,

FileInputStream stream = null; 
try { 
    stream = new FileInputStream(path); 
} catch(Exception e) { 
    Log.e("inputstream",e.toString()); 
} 
Rect rect = new Rect(a,b,c,d); 
return BitmapFactory.decodeStream(stream, rect, null);  

활동은 닫히고 로그 캣은 나에게 java.lang.outOfMemoryError를 알려줍니다 : 여기에 내 코드입니다. 왜 추락합니까? 스트림에서 "on-the-fly"이미지에서 작동해야한다고 생각했지만 오류에 대한 유일한 설명은 구멍 이미지를 메모리에로드하려고 시도한 것입니다. 아무도 이미지의 세부 사항을 어떻게로드 할 수 있는지, 또는 왜이 아이디어가 작동하지 않는지에 대한 아이디어가 있습니까?

답변

0

BitmapRegionDecoder가 도움이되지 않습니까?

+0

고마워요, 이것이 내가 찾고 있었던 것입니다. 오페어 레퍼런스에서도 큰 이미지에 대한 사이트가 있지만, 단지 InSampleSize를 사용하는 방법을 설명하는 것 뿐이며 'BitmapRegionDecoder'에 대한 단어가 아닙니다. 그러나, 내가 그것을 사용했을 때, 그것은 여전히 ​​추락했다. 나는 Decoder에 BitmapFactory.Options를 주었을 때 실수로 'DetectRegion'대신 '(rect, null)'(허용됨!)을 호출하는 대신 SampleSize 1을 사용하여 문제를 해결했습니다. 왜 그런지 알지만 그 일은 :-). 나는 타일과 RegionDecoder의 조합을 사용할 것이라고 생각한다. –

1

이 95M이 모두 처리를 위해 메모리에 빨려 들어서 추락했습니다. 이 호출은 스트림의 일부를 무시하지 않고 모든 것을 메모리에 저장 한 다음 조작하려고 시도합니다. 당신이 가질 수있는 유일한 해결책은 같은 종류의 조작을하는 일종의 서버 측 코드를 가지고 있거나 서버에서하지 않으려는 경우 - 큰 이미지의 축소판을 제공하는 것입니다. 그리고 어쨌든 95M 전체를 당기는 것에 대해 강력히 권고합니다.

+1

큰 이미지가 하나의 모 놀리 식 전체가 아니라 일련의 타일로 패키지 된 일부 게임 앱처럼 타일 기반 솔루션으로 이동하여 원하는 타일에로드하면됩니다. – CommonsWare

+0

또한 생성 된 배경에 작은 이미지를 오버레이하여 하나의 큰 이미지의 환상을 만들 수 있습니다. – Bostone