2012-06-30 13 views
23

पर बिटमैप सहेजें, मैं फ़ाइल बनाने के लिए बिटमैप को सहेजने की कोशिश कर रहा हूं और मेरे द्वारा बनाए गए फ़ंक्शन का उपयोग करके सीधे एक विशिष्ट। यह काम नहीं कर रहा है। यह bitmap.compress भाग के बाद दुर्घटनाग्रस्त हो जाता है (यहां 3 से पहले)।फ़ाइल फ़ंक्शन

File dir = new File(filepath); 

    if(!dir.exists())dir.mkdirs(); 

    File file = new File(Environment.getExternalStorageDirectory() + filepath, side + ".png"); 
    FileOutputStream fOut = new FileOutputStream(file); 

    bitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
    fOut.flush(); 
    fOut.close(); 

    System.out.println(filepath); 

    bitmap.recycle(); 
    System.gc(); 

त्रुटि लॉग:

06-29 00:16:38.089: D/AndroidRuntime(3260): Shutting down VM 
06-29 00:16:38.089: W/dalvikvm(3260): threadid=1: thread exiting with uncaught exception (group=0xb587f4f0) 
06-29 00:16:38.089: E/AndroidRuntime(3260): FATAL EXCEPTION: main 
06-29 00:16:38.089: E/AndroidRuntime(3260): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=0, result=-1, data=Intent { act=android.intent.action.VIEW dat=content://org.openintents.filemanager/mimetype//mnt/sdcard/download/02977_awreckedboatintheocean_1280x1024.jpg }} to activity {com.polygonattraction.testbirds/com.polygonattraction.testbirds.functions.SelectImageSource}: java.lang.IllegalStateException: Can't compress a recycled bitmap 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.handleSendResult(ActivityThread.java:2574) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.os.Looper.loop(Looper.java:130) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at dalvik.system.NativeStart.main(Native Method) 
06-29 00:16:38.089: E/AndroidRuntime(3260): Caused by: java.lang.IllegalStateException: Can't compress a recycled bitmap 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.graphics.Bitmap.checkRecycled(Bitmap.java:180) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.graphics.Bitmap.compress(Bitmap.java:581) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.polygonattraction.testbirds.functions.Functions.SaveToFile(Functions.java:144) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at com.polygonattraction.testbirds.functions.SelectImageSource.onActivityResult(SelectImageSource.java:113) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
06-29 00:16:38.089: E/AndroidRuntime(3260):  at android.app.ActivityThread.deliverResults(ActivityThread.java:2528) 
+1

क्या आपके logcat उत्पादन में मदद है? –

+0

"पुनर्नवीनीकरण बिटमैप को संपीड़ित नहीं किया जा सकता है।" क्या आपने bitmap.recycle() को बुलाया है; इससे पहले कहीं भी? –

+0

मैंने इसे सहेजने के बाद ही इसे बुलाया है, मैंने इसे हटाने का प्रयास किया है, लेकिन मुझे अभी भी वही त्रुटि मिलती है। –

उत्तर

64
  1. आप manifest.xml में एक उपयुक्त अनुमति की जरूरत:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    
  2. out.flush() जांच out नु नहीं है डालूँगा ..

  3. String file_path = Environment.getExternalStorageDirectory().getAbsolutePath() + 
              "/PhysicsSketchpad"; 
    File dir = new File(file_path); 
    if(!dir.exists()) 
        dir.mkdirs(); 
    File file = new File(dir, "sketchpad" + pad.t_id + ".png"); 
    FileOutputStream fOut = new FileOutputStream(file); 
    
    bmp.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
    fOut.flush(); 
    fOut.close(); 
    
+0

हाँ ............ –

+0

खेद नहीं है, क्या आप फ़ाइल लिखना चाहते हैं अगर यह केवल अस्तित्व में नहीं है? –

+0

"यह दुर्घटनाग्रस्त है" कृपया क्रैश की लॉग बिल्ली प्रदान करें ... –

11

मुझे लगता है कि यह बहुत अच्छा जवाब है।

आपके संदर्भ के लिए दो उदाहरण मेरे लिए काम करता है।

Bitmap bitmap = Utils.decodeBase64(base64); 
    try{ 
     File file = new File(filePath); 
     FileOutputStream fOut = new FileOutputStream(file); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut); 
     fOut.flush(); 
     fOut.close();} 
    catch (Exception e) { 
     e.printStackTrace(); 
     LOG.i(null, "Save file error!"); 
     return false; 
} 

और यह एक

Bitmap savePic = Utils.decodeBase64(base64); 
    File file = new File(filePath); 
    File path = new File(file.getParent()); 

    if (savePic != null) { 
     try { 
      // build directory 
      if (file.getParent() != null && !path.isDirectory()) { 
       path.mkdirs(); 
      } 
      // output image to file 
      FileOutputStream fos = new FileOutputStream(filePath); 
      savePic.compress(Bitmap.CompressFormat.PNG, 90, fos); 
      fos.close(); 
      ret = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } else { 
     LOG.i(TAG, "savePicture image parsing error"); 
    } 

मुझे लगता है कि यह बहुत अच्छा जवाब है।

4

यहाँ समारोह है जो आप

private void saveBitmap(Bitmap bitmap,String path){ 
     if(bitmap!=null){ 
      try { 
       FileOutputStream outputStream = null; 
       try { 
        outputStream = new FileOutputStream(path); //here is set your file path where you want to save or also here you can set file object directly 

        bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); // bitmap is your Bitmap instance, if you want to compress it you can compress reduce percentage 
        // PNG is a lossless format, the compression factor (100) is ignored 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } finally { 
        try { 
         if (outputStream != null) { 
          outputStream.close(); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      }  
     } 
    }