안드로이드 개발 질문/답변
(글 수 40,700)
제가 테스트 해본거로는 대충 어플당 2.8 메가 정도 이상의 힙 메모리를 사용할 시에
Out of Memory 가 발생합니다.
개발하는 어플 특성상 이미지를 화면보다 크게 일단 Bitmap 으로 만든 후에
확대, 축소를 하면서 보여주는 이미지 뷰어의 일종입니다.
현재 비트맵 사이즈에 관한 부분은 검색해서 전부 살펴 보았지만 원하는 결과를
얻지는 못햇습니다.
유저가 예를 들어 2560 * 2000 정도의 이미지를 넣는다면 어플에서는 결국
BitmapFactory 를 통해 만들어 놓고 가로, 세로 길이를 받아서 리사이즈해야 하는 경우가
생깁니다. 이럴때(이미지가 엄청 큰 경우) BitmapFactory 의 Options 값을 줘서 처음부터
작게 불러 오고 싶지만 Bitmap 파일로 만들지 않는 이상 가로와 세로의 길이를 알 수 없기
때문에 그것 또한 동적으로 할 수 없는 부분입니다.
혹시 자바에서 어떤 이미지를 메모리에 올리지 않고 (Bitmap 클래스로 만들지 않고 )
그 이미지의 가로값, 세로값을 알 수 있는 방법이 있습니까????
고수님들 부탁드립니다. 감사합니다.
2009.10.06 16:09:38
http://chiyo85.tistory.com/entry/Android-Bitmap-Object-Resizing-Tip 에 원하시는 내용은 아니지만 참고할만한것 같습니다.
2009.10.06 16:37:47
시스템 갤러리 프로그램에 잘 나와있습니다.
위와 비슷한 내용입니다.
아래 세곳을 살펴 보시길 바랍니다.
2329 options.inSampleSize = 1;
2331 options.inJustDecodeBounds = true;
3601 private static final int THUMBNAIL_TARGET_SIZE = 320;
packages/apps/Camera/src/com/android/camera/ImageManager.java
2325 if (options == null)
2326 options = new BitmapFactory.Options();
2327
2328 java.io.FileDescriptor fd = pfd.getFileDescriptor();
2329 options.inSampleSize = 1;
2330 if (targetWidthHeight != -1) {
2331 options.inJustDecodeBounds = true;
2332 long t1 = System.currentTimeMillis();
2333 BitmapFactory.decodeFileDescriptor(fd, null, options);
2334 long t2 = System.currentTimeMillis();
2335 if (options.mCancel || options.outWidth == -1 || options.outHeight == -1) {
2336 return null;
2337 }
2338 options.inSampleSize = computeSampleSize(options, targetWidthHeight);
2339 options.inJustDecodeBounds = false;
위와 비슷한 내용입니다.
아래 세곳을 살펴 보시길 바랍니다.
2329 options.inSampleSize = 1;
2331 options.inJustDecodeBounds = true;
3601 private static final int THUMBNAIL_TARGET_SIZE = 320;
packages/apps/Camera/src/com/android/camera/ImageManager.java
2325 if (options == null)
2326 options = new BitmapFactory.Options();
2327
2328 java.io.FileDescriptor fd = pfd.getFileDescriptor();
2329 options.inSampleSize = 1;
2330 if (targetWidthHeight != -1) {
2331 options.inJustDecodeBounds = true;
2332 long t1 = System.currentTimeMillis();
2333 BitmapFactory.decodeFileDescriptor(fd, null, options);
2334 long t2 = System.currentTimeMillis();
2335 if (options.mCancel || options.outWidth == -1 || options.outHeight == -1) {
2336 return null;
2337 }
2338 options.inSampleSize = computeSampleSize(options, targetWidthHeight);
2339 options.inJustDecodeBounds = false;
2009.10.06 17:29:52
빵야님 답변 감사합니다.. 링크해 주신 곳은 저도 몇번이나 확인 했던부분입니다 ^^;;
그 사이트에서는 Option 의 값으로 Image를 1/n 로 줄여서 가져오는 방법인데 그게
이미지의 넓이, 높이를 알고 있는 상황에서는 가능하지만 모르는 상황에서는 사이즈가 크면
어플이 죽습니다... 이 부분을 막으려고 미리 넓이, 높이값만 알 수 있다면 ( 메모리에 올리지 않고 )
안전하게 1/n 로 줄이면서 가져 올 수 있죠 ...
노쑤님 말씀대로 안드로이드 풀 소스를 검색 중입니다. ㅠㅠ 답변 감사드립니다.
2009.10.06 19:14:07
아.. 자답합니다.
뭐... 대단한건 아닙니다만 혹시 저와 같은 고민이 있으신 분이 계실꺼라고 생각합니다.
이미지를 메모리에 올리지 않고 그 이미지의 넓이와 높이의 값을 받아오는 방법입니다.
답변 달아 주신분들 다시한번 감사합니다~
/** Get Bitmap's Width **/ public static int getBitmapOfWidth( String fileName ){ try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(fileName, options); return options.outWidth; } catch(Exception e) { return 0; } } /** Get Bitmap's height **/ public static int getBitmapOfHeight( String fileName ){ try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(fileName, options); return options.outHeight; } catch(Exception e) { return 0; } }