2011-01-12 11 views
5

Es extremadamente fácil obtener los datos de Bitmap en el NDK cuando se trabaja con Android 2.2, pero con 2.1 y menor, la función AndroidBitmap_lockPixels no está disponible. He estado buscando las últimas horas, pero nada ha funcionado.Android Pass Bitmap to Native en 2.1 y más bajo

¿Cómo puedo acceder a los datos de píxel de un mapa de bits sin usar esa función?

+0

GuyNoir ¿Has comprobado android-opencv http://code.google.com/p/android-opencv/ son compatibles con 1.5 y por encima de – 100rabh

+0

Realmente no quiero tener que implementar openCV para una función tan simple. – GuyNoir

Respuesta

1

Crear mapa de bits vacío con dimensiones de imagen original y el formato ARGB_8888:

int width = src.getWidth(); 
int height = src.getHeight(); 
Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

Copia píxeles de mapa de bits fuente en la matriz int:

int[] pixels = new int[width * height]; 
src.getPixels(pixels, 0, width, 0, 0, width, height); 

Y establecer estos píxeles a mapa de bits de destino:

dest.setPixels(pixels, 0, width, 0, 0, width, height); 
+0

Lo siento, olvidé mencionar que estaba usando el NDK. Los píxeles funcionan bien en Java. – GuyNoir

1

Cree un IntBuffer en su código Java y pase la matriz hacia abajo t o su biblioteca nativa:

// this is called from native code 
buffer = IntBuffer.allocate(width*height); 
return buffer.array(); 

Use GetIntArrayElements para conseguir un jint * y escribir en la matriz:

de escritura a la matriz y cuando haya terminado, suelte:

env->ReleaseIntArrayElements((jintArray)bufferArray, arr, 0); 

Notificar el código de Java que la matriz se ha actualizado y utiliza Canvas.drawBitmap() para dibujar el IntBuffer:

canvas.drawBitmap(buffer.array(), ....); 

Para dibujar un mapa de bits, inicializar el lienzo con el mapa de bits

... new Canvas(bitmap) 
+0

Parece que se está acercando. Lo probaré. Gracias. – GuyNoir

+0

El NDK falla con un error que dice que env-> GetIntArrayElements y env-> ReleaseIntArrayElements no son parte de una estructura o unión. ¿Debo importar un archivo de encabezado? – GuyNoir

+0

se definen en jni.h que ya debería haber importado. tenga en cuenta que mis ejemplos están en C++ y no son simples c. en c las llamadas se verían así (* env) -> GetIntArrayElements (env, arr, NULL) – crazymaik

1

alguien acaba la misma pregunta - Voy a enlazar con él para evitar duplicar mi respuesta:

Android rendering to live wallpapers

En cualquier caso, probablemente no desee copiar los datos del mapa de bits cada vez que necesite intercambiarlo entre Java y el código JNI, por lo que si su código es sensible al rendimiento, esta puede ser su única opción en Android 2.1 y versiones posteriores .

+0

¡Ah! Eso definitivamente se parece a lo que estoy buscando. Lo comprobaré. ¡Gracias! – GuyNoir