无法压缩回收的位图

Luc*_*cia 10 android android-layout

我正在尝试将布局保存到SD卡中的图像中,但我收到此错误.我尝试了几个我在这个论坛中找到的代码,但是所有代码都有相同的压缩调用给出错误.

这是我用来保存图像的代码:

private Bitmap TakeImage(View v) {
        Bitmap screen = null;
        try {
            v.setDrawingCacheEnabled(true);

            v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                    MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());

            v.buildDrawingCache(true);
            screen = v.getDrawingCache();
            v.setDrawingCacheEnabled(false); // clear drawing cache
        } catch (Exception e) {
            e.printStackTrace();
        }
        return screen;
    }
Run Code Online (Sandbox Code Playgroud)

这是将其保存在SDCard中的代码:

private void saveGraph(Bitmap graph, Context context) throws IOException {
        OutputStream fOut = null;
        File file = new File(Environment.getExternalStorageDirectory()
                + File.separator + "test.jpg");
        fOut = new FileOutputStream(file);

        graph.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
        fOut.flush();
        fOut.close();

        MediaStore.Images.Media.insertImage(getContentResolver(),
                file.getAbsolutePath(), file.getName(), file.getName());
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

压缩调用中无法压缩回收的位图!

Gra*_*and 16

这可能导致位图被回收:

v.setDrawingCacheEnabled(false); // clear drawing cache
Run Code Online (Sandbox Code Playgroud)

如果您希望位图更长时间挂起,那么您应该复制它.

  • 你不应该拿出这条线; 从高速缓存提供的位图可以由拥有它的视图随时回收.你真的需要使用`Bitmap.copy()`来获取你自己的Bitmap副本. (2认同)

mir*_*ign 15

这解决了我的问题.

View drawingView = get_your_view_for_render;
drawingView.buildDrawingCache(true);
Bitmap bitmap = drawingView.getDrawingCache(true).copy(Config.RGB_565, false);
drawingView.destroyDrawingCache();
// bitmap is now OK for you to use without recycling errors.
Run Code Online (Sandbox Code Playgroud)