如何通过Android上的glReadPixels()获取24位颜色信息?

问题描述:

要通过OpenGL ES保存处理后的图像,我编码如下。它运作良好。如何通过Android上的glReadPixels()获取24位颜色信息?

ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 4); 
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, bb); 

try { 
    TJCompressor tjCompressor = new TJCompressor(bb.array(), 0, 0, mWidth, 0, mHeight, TJ.PF_RGB); 
    tjCompressor.setJPEGQuality(100); 
    tjCompressor.setSubsamp(TJ.SAMP_444); 
    return tjCompressor.compress(0); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

在此之后,以获得24位颜色信息,而无需alpha通道用于保存存储器和处理时间,我改变了线#1和如下的码#2。

ByteBuffer bb = ByteBuffer.allocate(mWidth * mHeight * 3); 
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGB, GL_UNSIGNED_BYTE, bb); 

然后附加地,我在MGL(GL10实例)的一个EGLConfig除去EGL_ALPHA_SIZE。当调用GLUtils.texImage2D()方法时,我通过了GLES20.GL_RGB作为内部格式参数。

但是,结果表明有错误。结果图像只有黑色,当我在glReadPixels()方法调用后检查bb缓冲区的数据时,我发现所有数据都为零。我需要建议。帮助,PLZ。

在芯GLES2,唯一有效的format/type连击为glReadPixels是:

  • GL_RGBA/GL_UNSIGNED_BYTE
  • 可选帧缓冲特异性经由glGetIntegerv查询与GL_IMPLEMENTATION_COLOR_READ_FORMATformat/typeGL_IMPLEMENTATION_COLOR_READ_TYPE分别

在没有exten的GLES2中sions,如果GL_IMPLEMENTATION_COLOR_READ_FORMAT/GL_IMPLEMENTATION_COLOR_READ_TYPE不产生有用的东西,不幸的是,你被卡住了GL_RGBA/GL_UNSIGNED_BYTE

使用GLES3,您可以将glReadPixels纳入绑定的GL_PACK_BUFFERglMapBufferRange,尽管您再次受限于format

我会注意到,驱动程序很容易模拟紧凑的rgb8 24位格式,而只实现了更好的对齐格式,如rgba8,rgb565和rgba4。暴露为“rgb8”的可呈现格式在后台可能只是rgbx8。

高度依赖于驱动程序,但如果您不关心保留framebuffer的内容,您可能可以使用EXT_discard_framebuffer赢回一些内存带宽。 (或GLES3中的glInvalidateFramebuffer

您也可以查看EGL_KHR_lock_surface3

+0

感谢您的详细解答。我发现它在其他一些设备上正常工作。 –