我正在尝试“拍摄”相机预览和叠加的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;
}
我会很感激任何想法/片段。非常感谢提前。
答案 0 :(得分:0)
我做过类似的事情,有点令人费解,但并不太可怕。
在我的情况下,我正在使用相机预览帧,我将其解码为位图。然后从该位图获取一个画布传递它,以调用我想要在图片顶部绘制的视图(surfaceview或其他)上的draw()。
Bitmap bm;
MySurfaceViewImpl sv;
Canvas c = new Canvas(bm);
sv.draw(c);
您将需要使用自己的View实现来处理画布大小将要更改的事实,并且您需要在应用程序的正常运行中发生的draw()调用之间重新调整大小。当你手动调用它时,画面大小的画布几乎肯定会与绘制到屏幕上的画布不同。
此外,我使用预览帧而不是捕获图片的主要原因是内存限制。很少有手机支持小尺寸的图片,但都支持合理尺寸的预览帧。将全尺寸相机图片放入位图可能是太多的内存。在堆积小于24MB的设备上,我可以使用大约600 x 480的图像和大约4个视图,但它会变得紧张。
在您的情况下,您可能需要缩小位图以便能够将画布从其传递到视图。
祝你好运!