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

사진불러와서 ImageView에 올릴때, 사이즈가 매우 클 경우.

0 추천
갤러리나 카메라에서 이미지를 가져와서 ImageView에 올리려고 합니다.

(옵션의 inSampleSize는 사용하지 않습니다. 원본그대로 불러와야하기때문에. )

 

근데 요즘은 스마트폰 성능이 좋아서... 찍은 사진의 사이즈가 4000*3000 정도까지도 되는듯하더군요..

그런 이미지를 불러와서 처리하려면 OutOfMemory가 상당히 자주발생하는것같습니다.

메모리를 최대한 잘 활용하려, 리사이클도 사용즉시 해주고 있는데도 말이죠..

 

아무튼 그래서, 이에대한 해결책을 찾아야할 것같은데요..

안드로이드펍 개발자정보에 스레드를 사용해서 이미지를 불러오면 된다고 나와있는데,

이렇게하면 아무리 큰 사이즈(4000*3000이상)의 이미지를 원본 그대로 불러와도 아웃오브메모리가 발생하지 않나요?

 

이에 대한 조언 부탁드립니다.
블랙이요블랙 (12,860 포인트) 님이 2013년 2월 21일 질문

2개의 답변

+1 추천
 
채택된 답변

안드로이드 버전 10(2.3.3)부터 이용가능한 BitmapRegionDecoder 를 이용하면 원하는 이미지의 부분별로 잘라서 로딩할수 있습니다. 위 class를 잘 활용하셔서 줌이 될때마다 원하는 SampleSize로 원하는 부부만 부분적으로 로딩하는 것이 가능합니다. 약간 번거로운 작업이 들어가겠지만 메모리 관리잘하면 원하시는 것 구현가능합니다.

회색 (21,340 포인트) 님이 2013년 2월 21일 답변
블랙이요블랙님이 2013년 2월 21일 채택됨
0 추천
이미지를 전체를 다 메모리에 올려서 사용하는게 아니고

보여지는 부분만 자르고, 리사이즈해서

실시간으로 메모리에 올려서 사용 하시는걸 추천합니다.

물론 리사이클도 계속 해주셔야 하구요

 

3.0 이전에서는 jni로 메모리 할당하는 과정에서 OOM이 나왔는데

이후로는 달빅에서 메모리 관리가 된다고 합니다

 

아시겠지만

메모리를 비울때 객체에 null을 assign 한다거나 관련 멤버변수를 static으로 선언하지 않았는지도 확인해주시구요
Noizbuster (11,970 포인트) 님이 2013년 2월 21일 답변
이미지를 원본그대로 불러와 scale로 디바이스화면크기에 맞게 이미지를 줄인후, 핀치줌인,줌아웃으로 원본사이즈까지 확대해서 볼수 있게해야하는데, 이때 최대한으로 확대되었을때 원본그대로 보여져야하는데, 화질이 떨어지지않게 처리해야합니다.

그래서 보여지는 부분만 잘라서 불러올수는 없을것같네요.. ㅠ

답변 감사합니다.

세상에 공짜는 없습니다. 저정도로 큰 이미지를 스마트폰에서 쓴다는거 자체가 에러입니다.

메모리가 없는데 어떻게 올리나요?

저건 아마 manifest에 Heap Size를 조정해도 안 될것 같네요.

 

밑에 댓글 보고 질문을 잘못 이해한것 같습니다 죄송합니다

...