2011-04-09 15 views

回答

16

jnigraphics庫可以用於從android.bitmap.Graphics類(當然是Java語言)在C/C++中訪問位圖緩衝區。在下面的NDK文檔中有更詳細的描述:

android-ndk-r5b/docs/STABLE-APIS.html 

它可以用來加載圖像,例如,在C/C++中使用OpenGL ES,但是您必須做一些工作才能將jobject交給該庫,以便它可以直接訪問緩衝區。您可以通過glTexImage2D()將該緩衝區傳遞給OpenGL。

首先,你需要一個Java Bitmap對象,你可以獲取並傳遞給你這樣的本地方法:

import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
     ... 

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = false; 

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), 
              R.drawable.myimage, options); 

MyJniMethod(bitmap); // Should be static in this example 

即本地方法可以是這個樣子:

#include <android/bitmap.h> 

void MyJniMethod(JNIEnv *env, jobject obj, jobject bitmap) { 
AndroidBitmapInfo info; 
uint32_t   *pixels; 
int    ret; 

AndroidBitmap_getInfo(env, bitmap, &info); 

if(info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { 
    LOGE("Bitmap format is not RGBA_8888!"); 
    return false; 
} 

AndroidBitmap_lockPixels(env, bitmap, reinterpret_cast<void **>(&pixels)); 

// Now you can use the pixel array 'pixels', which is in RGBA format 

} 

保持記住,當你完成像素緩衝時,你應該調用AndroidBitmap_unlockPixels(),並且這個例子根本不檢查錯誤。


希德達塔的問題更新:您可以保證輸出圖像格式是你加入這上面的選項期待什麼:

options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

有一種情況下輸出圖像將仍然在JNI中以未知格式結束。這似乎只發生在GIF上。調用BitmapFactory.decodeResource()後,可以將圖像轉換爲在必要時正確的格式:

if (bitmap.getConfig() != Bitmap.Config.ARGB_8888) { 
    Bitmap reformatted_bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, false); 
    bitmap.recycle(); /* reduce memory load in app w/o waiting for GC */ 
    bitmap = reformatted_bitmap; 
} 
+0

能夠保證所有的像素被裝在RGBA格式,在Android中的所有版本? – 2013-05-24 00:54:26

相關問題