使用Android 2.2时,在NDK中获取Bitmap数据非常容易,但2.1及更低版本的AndroidBitmap_lockPixels功能不可用。我一直在寻找过去的几个小时,但没有任何效果。
如何在不使用该功能的情况下访问位图的像素数据?
答案 0 :(得分:1)
使用原始图像尺寸和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);
答案 1 :(得分:1)
在Java代码中创建一个IntBuffer,并将该数组传递给您的本机库:
// 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)
答案 2 :(得分:1)
其他人刚问了同样的问题 - 我只是链接到它以避免重复我的回答:
Android rendering to live wallpapers
无论如何,您可能不希望每次需要在Java和JNI代码之间交换时复制位图数据,因此如果您的代码对性能敏感,这可能是您在Android 2.1及更低版本上的唯一选择