簡體   English   中英

如何在Android上通過glReadPixels()獲取24位顏色信息?

[英]How to get 24bit color information by glReadPixels() on android?

為了通過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);

然后另外,我刪除EGL_ALPHA_SIZE在MGL(GL10實例)的一個EGLConfig。 當調用GLUtils.texImage2D()方法時,我將GLES20.GL_RGB作為內部格式參數傳遞。

但是,結果表明出了點問題。 結果圖像只有黑色,當我在調用glReadPixels()方法后檢查bb緩沖區的數據時,發現所有數據均為零。 我需要建議。 幫助,請

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

  • GL_RGBA / GL_UNSIGNED_BYTE
  • 可選的特定幀緩沖- format / type經由查詢glGetIntegervGL_IMPLEMENTATION_COLOR_READ_FORMATGL_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贏回一些內存帶寬。 (或glInvalidateFramebuffer中的glInvalidateFramebuffer)

您可能還會查看EGL_KHR_lock_surface3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM