2013-05-20 23 views
7

Sto realizzando l'applicazione camer che è in grado di comporre l'anteprima e il png della fotocamera.outofmemoryerror durante la creazione di bitmap

vorrei salvare le immagini in onPictureTaken callback

mia fonte è al di sotto

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); 

Tuttavia dimostra OutOfMemoryError, come posso risolvere questo problema ..?

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

Sembra una perdita di memoria. Qual è la dimensione dell'immagine acquisita – Raghunandan

risposta

15

Prova questo codice ....

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); 


    } 
} 

ottenere l'immagine in bitmap quindi si utilizza secondo le vostre esigenze.

+0

Grazie Sandip! inSampleSize è un buon suggerimento per me, ma penso che il problema non si verifichi solo quando 'BitmapFactory.decodeByteArray'. Ci sono outofmemoryerror in canvas.drawBitmap (bitmap, null, new Rect (0, 0, bitmap.getWidth(), \t bitmap.getHeight()), null); come posso risolvere questo? – whitebear

+0

Penso che drawBitmap() sia il tuo metodo personalizzato. –

+0

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

0

Questo è un problema ben noto su Android. Il problema è che la manipolazione delle bitmap richiede più memoria di quella disponibile nella maggior parte dei dispositivi. Puoi comunque usare alcuni trucchi. Alcune discussioni e soluzioni per aiutarti a:

0

se yo u vuole salvare l'immagine a sdcard, provare come questo

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 { 

      } 

     } 
Problemi correlati