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

时间:2017-04-18 02:49:56

标签: android opengl-es glreadpixels

为了通过OpenGL ES保存已处理的图像,我制作了如下代码。它运作良好。

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

之后,要获得没有alpha通道的24位颜色信息以节省内存和处理时间,我按如下方式更改了代码的第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作为内部格式参数传递。

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

1 个答案:

答案 0 :(得分:0)

在核心GLES2中,glReadPixels的唯一有效format / type组合是:

  • GL_RGBA / GL_UNSIGNED_BYTE
  • 分别通过format typeglGetIntegerv查询的可选帧缓冲区GL_IMPLEMENTATION_COLOR_READ_FORMAT / GL_IMPLEMENTATION_COLOR_READ_TYPE

在没有附加信息的GLES2中,如果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。

高度依赖驱动程序,但如果您不关心保持帧缓冲区的内容,则可以使用EXT_discard_framebuffer赢回一些内存带宽。 (或GLES3中的glInvalidateFramebuffer

您也可以查看EGL_KHR_lock_surface3