【问题标题】:Android copyPixelsFromBuffer() to particular bitmap offset?Android copyPixelsFromBuffer() 到特定位图偏移量?
【发布时间】:2023-03-18 10:51:01
【问题描述】:

我正在开发一个 Android 应用程序,该应用程序在共享内存缓冲区上处理本机代码中的图形操作。我已经制作了使用 JNI 从 Java 调用我的本机代码的函数,我的本机代码使用 JNI API 从本机代码调用 Java。由于复制大量像素对性能有显着影响,因此我需要尽可能避免。

Bitmap 类的 Android 文档讨论了将像素复制到 Bitmap 内部缓冲区的两种方法: http://developer.android.com/reference/android/graphics/Bitmap.html

setPixels(int[] 像素, int offset, int stride, int x, int y, int width, int height) 用数组中的颜色替换位图中的像素。

copyPixelsFromBuffer(缓冲区源) 从缓冲区复制像素,从当前位置开始,覆盖位图的像素。

API 文档的问题在于,当您使用这些函数时,对于幕后发生的事情非常模糊。但是,在某处提到 copyPixelsFromBuffer() 直接复制像素而无需进行任何内部颜色格式转换,而 setPixels() 将在所有情况下进行转换,即使原始像素处于目标像素格式。显然,这不是我想要的,因为我缓冲区中的像素已经处于良好的格式。

现在,copyPixelsFromBuffer() 看起来非常好,因为它不会进行这种转换,但文档没有讨论如何将像素从缓冲区复制到目标位图中的特定偏移量。糟糕,这很重要,因为我不想每次都复制整个缓冲区,而只想复制一个区域。是的,文档说它将从源缓冲区中的当前位置复制,但没有提及目标缓冲区。 SetPixels() 进行不必要的转换,但允许您在目标缓冲区中指定偏移量。

所以,我被困在:

以像素转换为代价仅复制我想要的区域

以每次复制整个缓冲区为代价避免像素转换

为了了解一下,我可能有一个表示 1024x768 屏幕的缓冲区,其中有一个从 (300,300) 到 (400,400) 的无效区域。

如果我只复制需要更新的区域,我可以复制并转换 100*100 像素或复制而不转换 1024*768 像素。 100x100 的无效区域很小,仅在特定情况下,大多数无效区域将占用缓冲区的更大部分。这两种方法对性能都有非常负面的影响。

是否有人知道如何将像素从缓冲区复制到目标缓冲区上的特定偏移量,而无需强制像素转换?这将是两全其美,我不明白为什么它似乎不可用。

非常感谢您的帮助

【问题讨论】:

    标签: android bitmap java-native-interface android-ndk pixels


    【解决方案1】:

    我的猜测是该函数可能没有使用目标偏移量,因为它只是自动将源偏移量用于源和目标。你应该试试看。

    -n

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多