1.首先说明一下,只做参考。项目记录。由于项目需求,涉及到摄像头截图。当然了是GLSurfaceView了。
2.自己定义一个Renderer实现GLSurfaceView.Renderer,在onDrawFrame函数里面操作。
相信大部分人都是在这里面开启异步进行截图。使用这个函数,或者其他
GLES20.glReadPixels(0, 0,width_surface, height_surface,GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, intBuffer);
在此之前,楼主也是这样操作,发现截图会卡顿,每个机子卡顿时间不一样。但大多数要300多ms。或更久。
3.不想啰嗦了,上代码。
4.定义两对象。
private int[] fFrame = new int[1];
private int[] fTexture = new int[1];
5.开启的函数,这里是用GLES20。
private void bindfbo() {
GLES20.glGenFramebuffers(1, fFrame, 0);
GLES20.glGenTextures(1, fTexture, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fTexture[0]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width_surface, height_surface,0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glBindFramebuffer(GL_FRAMEBUFFER, fFrame[0]);
GLES20.glFramebufferTexture2D(GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D, fTexture[0], 0);
int status= GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
if(status !=GLES20.GL_FRAMEBUFFER_COMPLETE) {
throw new RuntimeException("status:"+status+", hex:"+Integer.toHexString(status));
}
}
6.每一次开启后要解绑
private void unbindfbo() {
GLES20.glBindFramebuffer(GL_FRAMEBUFFER, 0);
GLES20.glDeleteTextures(1, fTexture, 0);
GLES20.glDeleteFramebuffers(1, fFrame, 0);
}
7.注意事项:
不要每一次都开启。用按钮写个接口或者布尔值控制,点击就截图。然后解绑。
来张截图吧。