Android:如何将视图转换为位图,而不捕获背景屏幕

4

对于我的应用程序,我使用了捏合缩放功能,通过从教程中适应并创建自定义视图http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-6-implementing-the-pinch-zoom-gesture/1847

现在我正在努力将缩放后的图像捕获为位图。

部分地,我能够利用

setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
setDrawingCacheEnabled(false);

使用这种方法,我可以获得缩放后的图像和屏幕背景。

有没有办法只捕获缩放后的图像作为位图?

3个回答

0

这个原始答案在这里,只需替换设置背景部分。希望能有所帮助。

public static Bitmap getBitmapFromView(View view) {
    if (view == null) return null;
    //Define a bitmap with the same size as the view
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
    //Bind a canvas to it
    Canvas canvas = new Canvas(returnedBitmap);
    // draw white background on the canvas
    canvas.drawColor(Color.WHITE);
    // draw the view on the canvas
    view.draw(canvas);
    //return the bitmap
    return returnedBitmap;
}

0

尝试

setDrawingCacheEnabled(false)
finalView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
finalView.setDrawingCacheEnabled(false);

请在第一行后尝试使用destroyDrawingCache函数。 - weakwire
我已经尝试了 setDrawingCacheEnabled(false); destroyDrawingCache(); - Jitendar M
但是得到的结果相同,在位图中获取背景... - Jitendar M

0

在经过大量搜索后,我在同一社区中找到了一个“临时”解决方案,也感谢“weakwire”在同一帖子中提供的代码。

从矩阵获取坐标和宽度/高度

思路很简单,我所要做的就是通过裁剪从缩放图像中删除背景屏幕。 代码有点冗长,但对我起作用。

  1. 首先获取原始位图大小

    float imgWidth = imgBitmap.getWidth()   
    float imgHeight = imgBitmap.getHeight()
    
  2. 获取矩阵(我的应用程序中使用的捏合缩放功能使用矩阵“技巧”)值,用于缩放图像并获取原始图像的scaledWidth和scaledHeight。

    float[] values = new float[9];
    matrix.getValues(values);
    float globalX = values[2];
    float globalY = values[5];
    float scaledWidth = values[0]*imgWidth;
    float scaledHeight = values[4]*imgHeight;   
    
    // 如果缩放后的图像超出屏幕,则尝试通过考虑从(0,0)开始的图像来裁剪屏幕中可用的图像
    
    if(globalX<0)
    globalX = 0;
    
    if(globalY<0)
    globalY = 0;
    
  3. 最后捕获视图并裁剪背景 在我的情况下(“finalView”是自定义视图名称,在其中进行捏合缩放)

    setDrawingCacheEnabled(false);
    destroyDrawingCache();
    finalView.setDrawingCacheEnabled(true);
    Bitmap bm = Bitmap.createBitmap(finalView.getDrawingCache());
    finalView.setDrawingCacheEnabled(false);    
    
    // 最终图像宽度和高度
    
    int finalWidth = Math.min((int)width,(int)finalView.getWidth());
    int finalHeight = Math.min((int)height,(int)finalView.getHeight());        
    

    // 裁剪以获取缩放后的图像

     Bitmap finalBitmap = Bitmap.createBitmap(bm, (int)globalX, (int)globalY, finalWidth ,finalHeight);
    
尽管这只是个临时解决方案,它对我有用。如果有其他替代方案,请发布出来。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接