android快速像素访问和操作

afr*_*100 9 android image pixel draw android-canvas

我正在尝试将我用java编写的模拟器移植到android.事情进展顺利,我能够通过微小的更改移植我的大部分代码,但由于仿真的工作方式,我需要在像素级渲染图像.

至于我使用的桌面java

int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); 
Run Code Online (Sandbox Code Playgroud)

这允许我获得对像素缓冲区的引用并动态更新它(最小化对象创建)

目前这是我的android模拟器为每一帧做的

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

}   
Run Code Online (Sandbox Code Playgroud)

pixelsA是一个数组int [],pixelsA包含所有颜色信息,因此每个帧都需要通过执行来创建一个位图对象

buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);
Run Code Online (Sandbox Code Playgroud)

我认为这是相当昂贵和缓慢的.

有没有办法用画布有效地绘制像素?

Poi*_*ull 10

一个非常低级的方法,但对我来说工作正常(使用本机代码):

创建Bitmap与可见屏幕一样大的对象.还要创建一个View对象和实现onDraw方法.

然后在本机代码中,您将加载libjnigraphics.so本机库,查找函数AndroidBitmap_lockPixelsAndroidBitmap_unlockPixels.这些函数在bitmap.h中的Android源代码中定义.

然后你在位图上调用锁定/解锁,接收原始像素的地址.您必须根据实际情况(16位565或32位8888)解释RGB格式的像素.

更改位图的内容后,您希望在屏幕上显示此内容.打电话View.invalidate()给你View.在其中onDraw,将您的位图blit到给定的位置Canvas.

这个方法水平很低,并且依赖于Android的实际实现,但是它非常快,你可能得到60fps没问题.

bitmap.h是Android NDK自平台版本8以来的一部分,因此这是从Android 2.2执行此操作的官方方式.


Fem*_*emi 0

不要每次都重新创建位图。尝试这样的事情:

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:正如所指出的,您需要更新像素缓冲区。并且位图必须是可变的才能发生这种情况。