2011-12-16 7 views
3

큰 비트 맵 처리에 관해 몇 가지 질문이 있습니다.이 문제에 대해 지금까지 논의 된 주제에서 답변을 찾을 수 없었습니다.Android 카메라 애플리케이션 - 대형 비트 맵 처리

은 내가 이런 식으로 hardware.Camera 클래스와 이미지를 걸릴 넥서스 S가 :

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options); 
     } 
    } 
}; 

이미지가 5MPixels를 있다는 사실을 갖는, decodeByteArray의 시점에서 응용 프로그램이 충돌합니다. 그래서 생각, 만약이 충돌 다음 안드로이드의 카메라 애플 리케이션에서 어떻게 이루어집니다.

나는 소스를 다운로드하고이 나는 makeBitmap 방법이 발견 http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery/com/android/camera/Util.java.htm

그래서 내가 makeBitmap를 이용할 수 있도록 콜백을 변경 :

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 
     if (imageData != null) { 
      Bitmap bitmap = Utils.makeBitmap(imageData, 50 * 1024); 
     } 
    } 
}; 

그래서 내가 그 방법을 가져다가 내 응용 프로그램에 사용됩니다. 이 방법으로 만든 이미지는 품질이 낮을뿐만 아니라 픽셀 수 (50 * 1024)를 더 크게 만들면 다른 OutOfMemory 문제가 발생합니다.

내 질문에 큰 비트 맵을 사용하고 크기가 500x300 크기의 알파 레이어가있는 PNG를 의미하는 경우 어떻게해야합니까? Android Camera 앱에서 큰 이미지를 실제로 만드는 방법은 무엇입니까?

감사합니다.

+1

충돌 원인은 무엇입니까? starttrace/logcat을 제공하십시오. 그리고 소스 링크가 틀린 것 같습니다. - 해당 서명이있는 makeBItmap() 메소드가 없습니다. –

답변

0

를 디코딩 한 후 불행하게도 당신이 할 수있는

한 가지가 null로 imageData을 설정 한 비트 맵의 ​​크기로 올 것이다있다 그 대용량의 비트 맵을 메모리에 저장하여 표시 할 수는 없습니다. 디스플레이를위한 다운 샘플링 버전에서

byte[] imageData; 
FileOutputStream out = new FileOutputStream(file); 
out.write(imageData, 0, imageData.length); 
out.flush(); 
out.close(); 

그리고 나중에 부하 :

하지만 당신은 비트 맵을 저장할 수 있습니다.

FileInputStream inputStream = new FileInputStream(file); 
BitmapFactory.decodeStream(inputStream, null, options); 

여전히 오버 플로우하지 않고 이미지를 표시 할 수있는 동안, 원래 크기의 이미지를 유지하는 것이 방법.

참고 : 옵션을 사용하여 다운 샘플링 양을 지정해야합니다. 이것을 try {} catch {} 블록에 넣고 필요한 양이 확실하지 않은 경우 다운 샘플을 증가시키는 루프를 넣을 수 있습니다.

0

몇 가지 메모리를 확보하기 위해 시도 할 수 있지만, 궁극적으로