2013-05-20 12 views
7

Tworzę aplikację kamery, która może składać się z podglądu kamery i png.outofmemoryerror podczas tworzenia mapy bitowej

Chciałbym zapisać obrazy w onPictureTaken zwrotnego

moje źródło jest poniżej

public void onPictureTaken(byte[] data, Camera camera) { 

      //preview from camera 
      Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 

      // overlay image 
      Bitmap overlayBmp = overlay.getDrawingCache(); 

      //blank beatmap 
      Bitmap blankBitmap = 
      Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), 
      Bitmap.Config.ARGB_8888); 

      //make canvas 
      Canvas canvas = new Canvas(blankBitmap); 

      //composite image 
      canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(), 
    bitmap.getHeight()), null); 
      canvas.drawBitmap(overlayBmp, null,new Rect(0, 0, bitmap.getWidth(), 
    bitmap.getHeight()), null); 

jednak pokazuje OutOfMemoryError, jak mogę rozwiązać ten problem ..?

05-20 15:13:49.114: E/AndroidRuntime(31647): FATAL EXCEPTION: main 
05-20 15:13:49.114: E/AndroidRuntime(31647): java.lang.OutOfMemoryError 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.nativeCreate(Native Method) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:605) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:585) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at com.example.firstcameraappli.MainActivity$2.onPictureTaken(MainActivity.java:103) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:750) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at  android.os.Looper.loop(Looper.java:137) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.app.ActivityThread.main(ActivityThread.java:4514) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invokeNative(Native Method) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invoke(Method.java:511) 
05-20 15:13:49.114: E/AndroidRuntime(31647): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
+0

To chyba przeciek pamięci. Jaka jest wielkość przechwytywanego obrazu? – Raghunandan

Odpowiedz

15

Spróbuj ten kod ....

PictureCallback myPictureCallback_JPG = new PictureCallback() 
{ 

    @Override 
    public void onPictureTaken(byte[] data, Camera arg1) { 

     BitmapFactory.Options opt; 

     opt = new BitmapFactory.Options(); 
     opt.inTempStorage = new byte[16 * 1024]; 
     Parameters parameters = arg1.getParameters(); 
     Size size = parameters.getPictureSize(); 

     int height11 = size.height; 
     int width11 = size.width; 
     float mb = (width11 * height11)/1024000; 

     if (mb > 4f) 
      opt.inSampleSize = 4; 
     else if (mb > 3f) 
      opt.inSampleSize = 2; 

     //preview from camera 
     Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); 


    } 
} 

uzyskać obraz na bitmapę następnie użyć zgodnie z własnymi wymaganiami.

+0

Dzięki Sandip! inSampleSize jest dla mnie dobrą wskazówką, ale myślę, że problem nie występuje tylko wtedy, gdy "BitmapFactory.decodeByteArray". Występują outofmemoryerror w canvas.drawBitmap (bitmap, null, nowy Rect (0, 0, bitmap.getWidth(), \t bitmap.getHeight()), null); jak mogę to rozwiązać? – whitebear

+0

Myślę, że drawBitmap() jest niestandardową metodą. –

+0

createBitmap nadal pokazuje outofmemoryerror Bitmap b = Bitmap.createBitmap (v.getLayoutParams(). Width, v.getLayoutParams(). Height, Bitmap.Config.ARGB_8888); – whitebear

0

Jest to dobrze znany problem na Androida. Problem polega na tym, że manipulowanie bitmapami wymaga więcej pamięci, niż jest dostępne na większości urządzeń. Możesz jednak użyć pewnych sztuczek. Niektóre dyskusje i rozwiązania, które pomogą Ci:

0

jeśli yo u chcą, aby zapisać obraz do sdcard, spróbuj jak to

public void onPictureTaken(byte[] data, Camera camera) { 
      camera.startPreview(); 
      FileOutputStream outStream = null; 
      try { 
       outStream = new FileOutputStream(
         "/mnt/sdcard/mypicture.png"); 
       outStream.write(data); 
       outStream.close(); 
       Log.d("Log", "onPictureTaken - wrote bytes: " + data.length); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 

      } 

     } 
Powiązane problemy