J'essaie d'enregistrer un bitmap dans un fichier et un spécifique directement en utilisant une fonction que j'ai créée. Ça ne fonctionne pas. Il se bloque après la partie bitmap.compress (avant ici3).
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();
Journal des erreurs:
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)
Vous avez besoin d'une autorisation appropriée dans manifest.xml
:
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
out.flush()
vérifiez que out
n'est pas nul ..
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();
Deux exemples fonctionnent pour moi, pour votre référence.
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;
}
et celui-là
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");
}
En kotlin:
private fun File.writeBitmap(bitmap: Bitmap, format: Bitmap.CompressFormat, quality: Int) {
outputStream().use { out ->
bitmap.compress(format, quality, out)
out.flush()
}
}
exemple d'utilisation:
File(exportDir, "map.png").writeBitmap(bitmap, Bitmap.CompressFormat.PNG, 85)
Voici la fonction qui vous aide
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();
}
}
}