2017-04-18 52 views
0

要通過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。

回答

0

在芯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

感謝您的詳細解答。我發現它在其他一些設備上正常工作。 –

相關問題