将位图保存到文件function

我试图保存一个位图文件和一个特定的直接使用我创build的函数。 这不起作用。 它在bitmap.compress部分之后崩溃(在这里之前)。

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) 

Solutions Collecting From Web of "将位图保存到文件function"

  1. 您需要在manifest.xml有适当的权限:

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
  2. out.flush()检查out是不是null ..

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

我认为这是更好的答案。

两个例子适合我,供您参考。

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

我认为这是更好的答案。

这是帮助你的function

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