2012-05-22 15 views
7

मैं "onPictureTaken" में एक तस्वीर को घुमाने के लिएएंड्रॉयड: एक उच्च संकल्प चित्र बारी बारी से स्मृति त्रुटि के बाहर

public void onPictureTaken(byte[] data, Camera camera) { 
    String fileName = "last"+Calendar.getInstance().getTimeInMillis(); 
    String finalFilePath=null; 
    File temp= Environment.getExternalStorageDirectory(); 
    String destination=temp.getAbsolutePath()+"/pictureTest/"; 
    Bitmap bitmap1 = BitmapFactory.decodeByteArray(data, 0, data.length); 
    Matrix mat = new Matrix(); 
    mat.postRotate(90); // degree j'pense que t'as une methode qui te dit de combien tu veux faire t'as rotation. 
    Bitmap bBitmapRotate = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true); 
    try { 
     FileOutputStream fos = null; 
     finalFilePath=destination +"/" + fileName + ".jpg"; 
     fos = new FileOutputStream(finalFilePath); 
     BufferedOutputStream bos = new BufferedOutputStream(fos);     
     bBitmapRotate.compress(CompressFormat.JPEG, 80, bos); 
     bos.flush(); 
     bos.close(); 
    } 
    catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 

यह ठीक काम करता है अगर मैं एक 2Mp चित्र का उपयोग करने की कोशिश उत्पन्न करता है लेकिन अगर मैं एक 12MP चित्र मैं का उपयोग स्मृति त्रुटि से बाहर निकलें।

05-22 11:08:41.180: D/dalvikvm(29694): GC_FOR_MALLOC freed 674K, 51% free 3015K/6087K, external 18826K/19988K, paused 33ms 
05-22 11:08:41.190: I/dalvikvm-heap(29694): Grow heap (frag case) to 25.641MB for 2070498-byte allocation 
05-22 11:08:41.230: D/dalvikvm(29694): GC_CONCURRENT freed 133K, 40% free 4903K/8135K, external 17940K/19988K, paused 1ms+2ms 
05-22 11:08:41.700: D/dalvikvm(29694): GC_EXTERNAL_ALLOC freed 19K, 40% free 4884K/8135K, external 33575K/35623K, paused 24ms 
05-22 11:08:41.710: E/dalvikvm-heap(29694): 24000000-byte external allocation too large for this process. 
05-22 11:08:41.710: E/GraphicsJNI(29694): VM won't let us allocate 24000000 bytes 
05-22 11:08:41.720: D/dalvikvm(29694): GC_FOR_MALLOC freed <1K, 40% free 4884K/8135K, external 33575K/35623K, paused 14ms 
05-22 11:08:41.720: D/AndroidRuntime(29694): Shutting down VM 
05-22 11:08:41.720: W/dalvikvm(29694): threadid=1: thread exiting with uncaught exception (group=0x2aac8578) 
05-22 11:08:41.720: E/AndroidRuntime(29694): FATAL EXCEPTION: main 
05-22 11:08:41.720: E/AndroidRuntime(29694): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.nativeCreate(Native Method) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.createBitmap(Bitmap.java:477) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.graphics.Bitmap.createBitmap(Bitmap.java:444) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.cocoatweet.TestTweetPictureActivity.onPictureTaken(TestTweetPictureActivity.java:143) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:529) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.os.Handler.dispatchMessage(Handler.java:99) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.os.Looper.loop(Looper.java:138) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at android.app.ActivityThread.main(ActivityThread.java:3701) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at java.lang.reflect.Method.invokeNative(Native Method) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at java.lang.reflect.Method.invoke(Method.java:507) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
05-22 11:08:41.720: E/AndroidRuntime(29694): at dalvik.system.NativeStart.main(Native Method) 

मैंने कैमरा पैरामीटर से "setRotation()" सेट करने का प्रयास किया है लेकिन यह कुछ भी नहीं किया है।

public void onClick(View v) { 
       sendPicturedTweet(); 
      } 
     }); 
    } 

    protected void sendPicturedTweet() { 
     if(camera!=null){ 
      camera.stopPreview(); 
      Camera.Parameters camParams=this.camera.getParameters();    
      List<Size> sizes=camParams.getSupportedPictureSizes(); 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
      int prefSize=Integer.parseInt(preferences.getString(getString(R.string.picture_quality_key), "0")); 
      camParams.setPictureSize(sizes.get(prefSize).width, sizes.get(prefSize).height); 
      camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO); 
      camParams.setFlashMode(Camera.Parameters.FLASH_MODE_AUTO); 
      camParams.setWhiteBalance(Camera.Parameters.WHITE_BALANCE_AUTO); 
      camParams.setPictureFormat(ImageFormat.JPEG); 
      camParams.setJpegQuality(100); 
      camParams.setRotation(90); 
      camera.setParameters(camParams); 
      try{ 
       this.camera.setPreviewDisplay(surfaceHolder); 
       this.camera.startPreview(); 
       this.camera.takePicture(null, null, null, this); 
      }catch (Exception e) { 
       Log.e(LOG_TAG_VIDEO_PREVIEW, "ERROR IO on set preview display for camera."); 
      } 
     } 

    } 

मैं इस त्रुटि के बिना एक बड़ी तस्वीर कैसे घुमा सकता हूं और सर्वोत्तम चित्र गुणवत्ता संभव कैसे कर सकता हूं? क्या यह संभव है?

मैं एंड्रॉइड 2.3.7 के साथ सोनी एक्सपीरिया एस पर काम कर रहा हूं।

धन्यवाद।

+0

क्या मैं इसे काम करने के लिए रेंडरस्क्रिप्ट का उपयोग कर सकता हूं? – cooler007

उत्तर

1

जब आप इस लाइन

Bitmap bBitmapRotate = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true); 

आप पहले से ही स्मृति में छवि दो बार है, बाइट [] डेटा के रूप में और बिटमैप bitmap1 के रूप में पहुंच जाते हैं। मुझे लगता है कि आप बाइट [] डेटा साफ़ करने के लिए एक तरह से इससे पहले कि आप छवि

+0

आपके उत्तर के लिए धन्यवाद, मैंने बाद में छवि पर काम करने की कोशिश की है लेकिन फिर मैं इसे बिटमैप में लोड करने में भी सक्षम नहीं हूं। – cooler007

1

(पैरामीटर के रूप में सीधे बिटमैप भेजकर जैसे) को बदलने के लिए उपयोग कर छवि के आकार को कम करने की कोशिश खोजना चाहिए BitmapFactory.Option

BitmapFactory.Options option = new BitmapFactory.Options(); 
      option.inSampleSize = 2; 
+0

यह एक विकल्प है यदि मुझे बेहतर तरीका नहीं मिल रहा है। मुझे सबसे अच्छी गुणवत्ता की आवश्यकता है और यदि मैं यह सही समझता हूं: यदि मैं छवि के आकार को कम करता हूं, तो मैं गुणवत्ता को भी कम करता हूं। मुझे 12 एमपी रिज़ॉल्यूशन रखने की जरूरत है। – cooler007

+0

http://stackoverflow.com/questions/2997703/android-remote-image-getting-problem –

-1

कैसे इस बारे में:

bitmap1 = Bitmap.createBitmap(bitmap1, 0, 0, bitmap1.getWidth(), bitmap1.getHeight(), mat, true); 

आप उपयोग करने के लिए स्मृति सीमित है, इसलिए आप ऐसा बड़ी तस्वीर को संभालने के लिए हो तब आप अपनी स्मृति को बचाने के बारे में सोचना है।

1

आप एंड्रॉइड पर एंड्रॉइड लगाए गए अधिकतम ढेर आकार की सीमा को दूर करने के लिए जेएनआई (एनडीके का उपयोग करके) का उपयोग कर सकते हैं।

  1. एक JNI कार्य करने के लिए बिटमैप पारित:

    इस मामले में

    , क्या तुम कर सकते हो निम्नलिखित है। जेएनआई फ़ंक्शन में

  2. , बिटमैप के बाइट पढ़ें।
  3. बिटमैप रीसायकल।
  4. एक नया बिटमैप बनाएं और उसमें डाले गए पिक्सल डालें।
  5. जावा कोड पर बिटमैप वापस करें।

यदि आप चाहें, तो मैंने एक नमूना कोड बनाया है जो इसे करता है, here

संबंधित मुद्दे