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.注意事项:
不要每一次都开启。用按钮写个接口或者布尔值控制,点击就截图。然后解绑。
来张截图吧。