Android将许多位图组合成一个大的错误并且无法回收位图

时间:2014-01-10 12:58:23

标签: android bitmap

我想将ArrayList中包含的许多小位图组合成一个大位图。

但是,我不知道为什么大位图是循环的。这意味着它似乎只复制数组中的第一个元素。我试图在数组中绘制每个小位图进行测试并且它工作正常,但是当我像下面的代码一样运行循环时,它会出错。

在addiditon中,当我添加bmp.recycle()bmp = null时,会导致错误“尝试使用回收的位图”。我不明白为什么会发生错误。

请帮助我,谢谢!

public static Bitmap getBitmapForVisibleRegion(WebView webview) {
        Bitmap returnedBitmap = null;
        webview.setDrawingCacheEnabled(true);
        returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache());
        webview.setDrawingCacheEnabled(false);
        return returnedBitmap;
    }


public void CombineBitmap(){
    ArrayList<Bitmap> bmps = new ArrayList<Bitmap>();
    for (int i = 0; i < webView.getWidth; i+=needToCapture){
    bmps.add(getBitmapForVisibleRegion(webView));
    webView.scrollBy(needToCapture, 0);

    }

            Bitmap bigbitmap    = Bitmap.createBitmap(largeBitmapWidth, largeBitmapHeight, Bitmap.Config.ARGB_8888);
            Canvas bigcanvas    = new Canvas(bigbitmap);

            Paint paint = new Paint();
            int iWidth = 0;

            for (int i = 0; i < bmps.size(); i++) {
                Bitmap bmp = bmps.get(i);
                bigcanvas.drawBitmap(bmp, iWidth , 0, paint);
                iWidth +=bmp.getWidth();

                bmp.recycle();
                bmp=null;
            }
}

2 个答案:

答案 0 :(得分:1)

我终于找到了我的问题。这是因为我的假错误。

我必须使用scrollTo而不是scrollBy

更改为scrollTo后,一切正常。这真的是一种有用的体验。

答案 1 :(得分:0)

根据Bitmap.createBitmap(位图)的文档,

  

从源位图返回不可变位图。新位图可以是与源相同的对象,也可以是副本。它的初始化密度与原始位图相同。

因此,请替换

returnedBitmap = Bitmap.createBitmap(webview.getDrawingCache());

returnedBitmap = webview.getDrawingCache().copy(Config.ARGB_8888, false);