1

我正在尝试为相机预览和叠加的 GLSurfaceView“拍照”。我通过 camera.takePicture() 和 PictureCallback() 使相机预览元素工作,但现在需要包含 GLSurfaceView 元素,或者单独捕获当前屏幕并将两个位图合并到一个文件中。我尝试使用下面的代码从surfaceView 中获取图像,但这只会导致空位图。

public Bitmap grabImage() {

    this.setDrawingCacheEnabled(true);
     Bitmap b = null;
     try {

     b = this.getDrawingCache(true);
     if (b==null) {

         b = this.getDrawingCache(true);
     }
     } catch (Exception e) {
         e.printStackTrace();
     }
     this.setDrawingCacheEnabled(false);
     return b;
 }

我将不胜感激有关此的任何想法/片段。提前谢谢了。

4

1 回答 1

0

我做过类似的事情,有点令人费解,但并不算太糟糕。

在我的情况下,我使用的是我解码为位图的相机预览帧。然后从该位图中获取一个画布,将其传递给我想要在图片顶部绘制的视图(surfaceview 或其他)上的 draw() 调用。

            Bitmap bm;
            MySurfaceViewImpl sv;
            Canvas c = new Canvas(bm);
            sv.draw(c);

您将需要使用自己的 View 实现来处理画布大小将发生变化的事实,并且您需要在应用程序正常运行和调用时发生的 draw() 调用之间重新调整大小它是手动的,因为图片大小的画布几乎肯定会与绘制到屏幕上的内容不同。

此外,我使用预览帧而不是捕获的图片的主要原因是由于内存限制。很少有手机支持小尺寸图片,但都支持预览帧的合理尺寸。将完整尺寸的相机图片放入位图中可能会占用太多内存。在堆小于 24MB 的设备上,我可以使用大约 600 x 480 的图像和在其上绘制的大约 4 个视图,但它会变得很紧。

在您的情况下,您可能需要缩小位图才能将画布从它传递到视图。

祝你好运!

于 2011-04-06T22:52:23.077 回答