将相机预览和GLSurfaceView捕获到文件中

时间:2011-04-06 18:02:15

标签: android glsurfaceview

我正在尝试“拍摄”相机预览和叠加的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;
 }

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; }

我会很感激任何想法/片段。非常感谢提前。

1 个答案:

答案 0 :(得分:0)

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

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

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

您将需要使用自己的View实现来处理画布大小将要更改的事实,并且您需要在应用程序的正常运行中发生的draw()调用之间重新调整大小。当你手动调用它时,画面大小的画布几乎肯定会与绘制到屏幕上的画布不同。

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

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

祝你好运!