私が作成した関数を使用して、ビットマップを特定のファイルに直接保存しようとしています。動いていない。 bitmap.compressパーツの後にクラッシュします(here3より前)。
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)
_manifest.xml
_に適切な許可が必要です:
_<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
_
out.flush()
out
がnullではないことを確認してください。
_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();
_
2つの例が参考になります。
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");
}
コトリンでは:
private fun File.writeBitmap(bitmap: Bitmap, format: Bitmap.CompressFormat, quality: Int) {
outputStream().use { out ->
bitmap.compress(format, quality, out)
out.flush()
}
}
使用例:
File(exportDir, "map.png").writeBitmap(bitmap, Bitmap.CompressFormat.PNG, 85)
ここにあなたを助ける関数があります
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();
}
}
}