[英]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
經由查詢glGetIntegerv
與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_BUFFER
和glMapBufferRange
中,盡管如此,您仍然受到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.