2011-04-09 4 views

답변

16

android.bitmap.Graphics 클래스 (Java에서는 물론)에서 C/C++의 비트 맵 버퍼에 액세스하려면 jnigraphics 라이브러리를 사용할 수 있습니다. 아래의 NDK와 함께 제공되는 설명서에서 더 자세히 설명되어 있습니다.

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

예를 들어 다음과 같은 이미지를로드하는 데 사용할 수 있습니다. C/C++에서 OpenGL ES를 사용하지만 버퍼에 직접 액세스 할 수 있도록 해당 라이브러리에 jobject을 넘겨 주어야합니다. 버퍼를 glTexImage2D()을 통해 OpenGL에 전달할 수 있습니다.

#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 

} 

유지 : 기본 방법은 다음과 같이 보일 수

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 

그건 :

첫째, 당신은 당신이 획득하고이 같은 네이티브 메소드에 전달할 수있는 자바 Bitmap 객체를 필요 픽셀 버퍼가 끝나면 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 형식으로 포장되는 것을 보장되어 있습니까? –