2011-01-12 5 views
5

Es ist extrem einfach, die Bitmap-Daten im NDK zu erhalten, wenn Sie mit Android 2.2 arbeiten, aber mit 2.1 und niedriger ist die AndroidBitmap_lockPixels Funktion nicht verfügbar. Ich habe die letzten paar Stunden gesucht, aber nichts hat funktioniert.Android Pass Bitmap auf Native in 2.1 und niedriger

Wie kann ich auf die Pixeldaten einer Bitmap zugreifen, ohne diese Funktion zu verwenden?

+0

GuyNoir Haben Sie android-opencv überprüft http://code.google.com/p/android-opencv/ sie unterstützen 1.5 und höher – 100rabh

+0

Ich möchte nicht wirklich OpenCV für solch eine einfache Funktion zu implementieren. – GuyNoir

Antwort

1

Erstellen leer Bitmap mit Abmessungen von Originalbild und ARGB_8888 Format:

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

Copy Pixel von Quellbitmap zum int array:

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

, und legt diese Pixel zum Ziel-Bitmap:

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

Entschuldigung, ich habe vergessen zu erwähnen, dass ich das NDK benutzt habe. Pixel funktionieren in Java gut. – GuyNoir

1

Erstellen Sie einen IntBuffer in Ihrem Java-Code und übergeben Sie das Array t o Ihre native Bibliothek:

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

Verwenden GetIntArrayElements ein JINT * zu erhalten und auf das Array schreiben:

Schreiben auf das Array und wenn Sie fertig sind, loslassen:

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

Benachrichtigen der Java-Code, für den das Array aktualisiert wurde, und Canvas.drawBitmap() zum Zeichnen des IntBuffers:

Um auf eine Bitmap zu zeichnen, initialisieren Sie die Leinwand mit der Bitmap

... new Canvas(bitmap) 
+0

Das sieht aus wie es näher kommt. Ich werde es ausprobieren. Vielen Dank. – GuyNoir

+0

Der NDK schlägt mit einem Fehler fehl, der besagt, dass env-> GetIntArrayElements und env-> ReleaseIntArrayElements nicht Teil einer Struktur oder einer Union sind. Muss ich eine Header-Datei importieren? – GuyNoir

+0

Sie sind in jni.h definiert, die Sie bereits importiert haben sollten. Bitte beachten Sie, dass meine Beispiele in C++ und nicht in c sind. in c würden die Aufrufe ungefähr so ​​aussehen (* env) -> GetIntArrayElements (env, arr, NULL) – crazymaik

1

Jemand anderes nur die gleiche Frage gestellt - ich werde verknüpfen, nur um es meine Antwort zu vermeiden Duplizieren:

Android rendering to live wallpapers

In jedem Fall möchten Sie die Bitmap-Daten wahrscheinlich nicht jedes Mal zwischen Java und JNI-Code austauschen. Wenn Ihr Code also leistungsabhängig ist, ist dies unter Android 2.1 und niedriger möglicherweise die einzige Option .

+0

Ah! Das sieht definitiv so aus, wonach ich suche. Ich werde das überprüfen. Vielen Dank! – GuyNoir

Verwandte Themen