2013-09-29 52 views
2

我想捕獲從OpenGL ES的幀緩衝數據和從它創建一個圖像,基本上,以此來捕捉屏幕截圖從OpenGL ES的幀緩衝區通過JNI在Android NDK創建位圖圖像

我試圖通過JNI使用BitmapFactory類來完成轉換。這裏是我當前的代碼:

size_t size = w * h; 
uint8_t *pixels = new uint8_t[size]; 
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
jobject jbitmap = 0; 

if(pixels != 0) { 
    JNIEnv * env = GetEnv(state_->activity->vm); 

    //create the jbyte array and fill in with the pixel data 
    int byte_array_length = w * h; 
    jbyteArray byte_array = env->NewByteArray(byte_array_length); 
    env->SetByteArrayRegion(byte_array, 0, byte_array_length, (jbyte *)pixels); 

    //get the BitmapFactory class 
    jclass bitmap_factory_class = loadExternalClass("android/graphics/BitmapFactory"); 
    jmethodID decode_byte_array_method = env->GetStaticMethodID(bitmap_factory_class, 
    "decodeByteArray", "([BII)Landroid/graphics/Bitmap;"); 

    //get the bitmap itself 
    jbitmap = env->CallStaticObjectMethod(bitmap_factory_class, decode_byte_array_method, 
    byte_array, 0, byte_array_length); 

    env->DeleteLocalRef(byte_array); 
} 

if(jbitmap == 0) { 
    Log("Could not create image from framebuffer to share"); 
} 

基本上,代碼試圖做的是:

  • 捕獲的OpenGL幀緩衝區爲像素陣列
  • 尺寸W * H的創建jbyteArray
  • 填充jbytearray
  • 獲取BitmapFactory類
  • 用jbytearray調用decodeByteArray方法

然而,jbitmap對象被連續地設置爲0,這使我認爲BitmapFactory呼叫失敗,我不知道爲什麼用於捕獲幀緩衝器到該像素陣列(

相同的代碼即:glReadPixels調用)使用沒有問題在iOS & MacOSX,所以我不認爲問題在於那裏

因此,任何幫助我可能會失蹤?

+0

最初發布到[android-ndk google group](https://groups.google.com/forum/#!topic/android-ndk/oA6v40n49S8) – codemonkey

+0

@ AndonM.Coleman我已經記錄了所有三個(w, h&像素)。 W&H確實符合我的屏幕尺寸,並且像素不爲零,也不全爲零。對於我來說,確定它是否確實是有效的數據有點困難,但我猜測它應該是,因爲它只是一個直線glReadPixels調用 – codemonkey

回答

3

你爲什麼打電話解碼關於glReadPixels (...)返回的數據?在大多數情況下,數據是原始RGB [A];它會更有意義編碼它。對於我所知道的,這可能是正確的,但對於Google來說,調用一個將像素的原始緩衝區編碼爲更專門的像素集合的函數是愚蠢的。

我不得不從一個直觀的角度來想象,decodeByteArray (...)實際上是要採取代表一些標準圖像文件格式的字節數組並將其解碼爲通用位圖。

既然如此,就不會是這樣的:

Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); // Yes, ARGB 
bm.copyPixelsFromBuffer (pixels); 

更有意義?

我不完全確定JNI綁定應該看起來像這樣,但是這會從RAW像素數據創建一個位圖,而不是嘗試解碼未首先編碼的東西。我想象一下,當Android在前幾個字節的數據中找不到可識別的文件簽名時,您正在嘗試執行的操作幾乎立即失敗。

+0

具有很大意義。謝了哥們。我會相應地調整代碼 – codemonkey

相關問題