android fast pixel access and manipulation

馋奶兔 提交于 2019-12-03 03:45:16
Pointer Null

One quite low-level method, but working fine for me (with native code):

Create Bitmap object, as big as your visible screen. Also create a View object and implement onDraw method.

Then in native code you'd load libjnigraphics.so native library, lookup functions AndroidBitmap_lockPixels and AndroidBitmap_unlockPixels. These functions are defined in Android source in bitmap.h.

Then you'd call lock/unlock on a bitmap, receiving address to raw pixels. You must interpret RGB format of pixels accordingly to what it really is (16-bit 565 or 32-bit 8888).

After changing content of the bitmap, you want to present this on screen. Call View.invalidate() on your View. In its onDraw, blit your bitmap into given Canvas.

This method is very low level and dependent on actual implementation of Android, however it's very fast, you may get 60fps no problem.

bitmap.h is part of Android NDK since platform version 8, so this IS official way to do this from Android 2.2.

You can use the drawBitmap method that avoids creating a Bitmap each time, or even as a last resort, draw the pixels one by one with drawPoint.

Don't recreate the bitmap every single time. Try something like this:

Bitmap buffer = null;
@Override
public void onDraw(Canvas canvas)
{
    if(buffer == null) buffer = Bitmap.createBitmap(256, 192, Bitmap.Config.RGB_565);
    buffer.copyPixelsFromBuffer(pixelsA);
    canvas.drawBitmap(buffer, 0, 0, null);
}

EDIT: as pointed out, you need to update the pixel buffer. And the bitmap must be mutable for that to happen.

if pixelsA is already an array of pixels (which is what I would infer from your statement about containing colors) then you can just render them directly without converting with:

canvas.drawBitmap(pixelsA, 0, 256, 0, 0, 256, 192, false, null);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!