2013-05-20 8 views
7

बनाते समय आउटफोमेमोरीरर मैं कैमरे के एप्लिकेशन को बना रहा हूं जो कैमरा पूर्वावलोकन और पीएनजी को मिश्रित कर सकता है।बिटमैप

मैं कैसे मैं इस समस्या को हल कर सकते हैं नीचे

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

हालांकि यह OutOfMemoryError से पता चलता onPictureTaken कॉलबैक में छवियों

मेरे स्रोत है को बचाने के लिए चाहते हैं, ..?

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

ऐसा लगता है कि यह एक स्मृति रिसाव है। कैप्चर की गई छवि का आकार क्या है – Raghunandan

उत्तर

15

तरह की कोशिश इस कोड का प्रयास करें,

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


    } 
} 

बिटमैप में छवि प्राप्त तो आप अपने आवश्यकताओं के अनुसार के रूप में उपयोग करना चाहते हैं।

+0

धन्यवाद संदीप! inSampleSize मेरे लिए अच्छा संकेत है, लेकिन मुझे लगता है कि समस्या तब होती है जब 'BitmapFactory.decodeByteArray'। Canvas.drawBitmap (bitmap, null, new rect (0, 0, bitmap.getWidth(), \t bitmap.getHeight()), null) में outofmemoryerror हैं; मैं इसे कैसे हल करूं? – whitebear

+0

मुझे लगता है कि drawBitmap() आपकी कस्टम विधि है। –

+0

createBitmap अभी भी outofmemoryerror Bitmap b = Bitmap.createBitmap (v.getLayoutParams()। चौड़ाई, v.getLayout पैराम() ऊंचाई, बिटमैप। कॉनफिग.एआरबीबी_8888); – whitebear

0

यह एंड्रॉइड पर एक प्रसिद्ध मुद्दा है। समस्या यह है कि बिटमैप्स में हेरफेर करने से अधिकांश उपकरणों में उपलब्ध होने की तुलना में अधिक मेमोरी की आवश्यकता होती है। हालांकि आप कुछ चाल का उपयोग कर सकते हैं। कुछ विचार विमर्श और समाधान आप मदद करने के लिए:

0

अगर यो यू sdcard के लिए छवि को बचाने के लिए .... यह

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 { 

      } 

     }