android 快速像素访问和操作

标签 android image android-canvas draw pixel

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

至于我用的桌面java

int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); 

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

目前这是我的安卓模拟器对每一帧所做的

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

}   

pixelsA是一个int[]数组,pixelsA包含了所有的颜色信息,所以每一帧都需要创建一个位图对象

buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565);

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

有什么方法可以用 Canvas 高效地绘制像素吗?

最佳答案

一个非常低级的方法,但对我来说效果很好(使用 native 代码):

创建 Bitmap 对象,与您的可见屏幕一样大。 同时创建一个 View 对象并实现 onDraw 方法。

然后在本地代码中加载 libjnigraphics.so 本地库、查找函数 AndroidBitmap_lockPixelsAndroidBitmap_unlockPixels。 这些函数在 Android 源代码中的 bitmap.h 中定义。

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

更改位图内容后,您希望将其显示在屏幕上。 在您的 View 上调用 View.invalidate()。在它的 onDraw 中,将您的位图 blit 到给定的 Canvas

此方法非常低级,依赖于 Android 的实际实现,但速度非常快,您可以毫无问题地获得 60fps。

bitmap.h 自平台版本 8 起就是 Android NDK 的一部分,因此这是从 Android 2.2 开始执行此操作的官方方法。

关于android 快速像素访问和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7593810/

相关文章:

java - 允许用户在 Canvas 上绘图

android - 我可以将用 Kotlin 编写的库导入到我的 android 项目中吗(使用 java)

java - Android应用内计费如何实现

php - imagick/php - 检查图片之间的差异和变化的判断

php - 我从数据库中提取的图像有时不会在浏览器中显示,但如果我查看源代码,它们就会显示

flutter - 如何获取ui.Image(dart :ui) from network image?

android - 在 Android 中的电子邮件中嵌入图像

android - AJAX 调用不适用于 phonegap apk build

PHP-GD 水印 PNG 的透明度未与 JPEG 正确合并

java - 如何使android Canvas 每5秒重新绘制一次