Android Pass Bitmap to Native в версии 2.1 и ниже

Получить данные Bitmap в NDK очень просто при работе с Android 2.2, но с 2.1 и более ранними версиями функция AndroidBitmap_lockPixels недоступна. Я искал последние несколько часов, но ничего не получилось.

Как я могу получить доступ к пиксельным данным растрового изображения без использования этой функции?


person Kleptine    schedule 12.01.2011    source источник
comment
GuyNoir Вы проверили android-opencv code.google.com/p/android-opencv они поддерживают 1.5 и выше   -  person 100rabh    schedule 14.01.2011
comment
Я действительно не хочу реализовывать openCV для такой простой функции.   -  person Kleptine    schedule 16.01.2011


Ответы (3)


Создайте пустое растровое изображение с размерами исходного изображения и форматом ARGB_8888:

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

Скопируйте пиксели из исходного растрового изображения в массив int:

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

И установите эти пиксели в целевое растровое изображение:

dest.setPixels(pixels, 0, width, 0, 0, width, height);
person fmo    schedule 14.01.2011
comment
Извините, я забыл упомянуть, что использовал NDK. Пиксели отлично работают в Java. - person Kleptine; 14.01.2011

Создайте IntBuffer в своем Java-коде и передайте массив в свою родную библиотеку:

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

Используйте GetIntArrayElements, чтобы получить jint* и записать в массив:

jint * arr = env->GetIntArrayElements((jintArray)bufferArray, NULL);

Запишите в массив и, когда закончите, отпустите:

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

Сообщите коду Java, что массив был обновлен, и используйте Canvas.drawBitmap() для рисования IntBuffer:

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

Чтобы рисовать в растровое изображение, инициализируйте холст растровым изображением.

... new Canvas(bitmap)
person Maik    schedule 18.01.2011
comment
Это похоже на приближение. Я проверю это. Спасибо. - person Kleptine; 19.01.2011
comment
NDK завершается с ошибкой, говорящей о том, что env->GetIntArrayElements и env->ReleaseIntArrayElements не являются частью структуры или объединения. Должен ли я импортировать файл заголовка? - person Kleptine; 19.01.2011
comment
они определены в файле jni.h, который вы уже должны были импортировать. обратите внимание, что мои примеры написаны на С++, а не на простом С. в c вызовы будут выглядеть примерно так (*env)->GetIntArrayElements(env, arr, NULL) - person Maik; 19.01.2011
comment
Ну, я могу получить доступ к целым числам цветов, но любые попытки изменить их, похоже, заканчиваются неудачей. Не могли бы вы опубликовать или дать ссылку на простой пример кода, который редактирует значение RGBA растрового изображения с помощью NDK? Спасибо за помощь. - person Kleptine; 24.01.2011

Кто-то только что задал тот же вопрос - я просто дам ссылку на него, чтобы не дублировать свой ответ:

Android рендеринг в живые обои

В любом случае вы, вероятно, не захотите копировать растровые данные каждый раз, когда вам нужно обмениваться ими между кодом Java и JNI, поэтому, если ваш код чувствителен к производительности, это может быть вашим единственным вариантом на Android 2.1 и ниже.

person Daniel Schuler    schedule 26.04.2011
comment
Ах! Это определенно похоже на то, что я ищу. Я проверю это. Спасибо! - person Kleptine; 26.04.2011