gpt4 book ai didi

java - 从 C 尽快填充 Android 位图中的数据

转载 作者:搜寻专家 更新时间:2023-10-30 19:46:54 26 4
gpt4 key购买 nike

我已经设法创建了一个 android.graphics.Bitmap,并且我通过 SetPixels 命令成功地填充了它。

问题是我从 RGBA 数据开始。然后我创建了一个 jintArray。然后我调用 SetIntArray(有效地将数据存储到缓冲区中)。然后,最后,我调用 setPixels 来实际设置像素(这可能会导致另一个副本)。

这样做的一个大问题是,无论我使用 R8G8B8A8、R5G6B5 还是 A8,我仍然必须将像素数据转换为 R8G8B8A8 数据。

理想情况下,我想要一种只使用一个副本来填充缓冲区的方法,并且允许我在不进行像素格式转换的情况下执行此操作。

有什么方法可以直接获取位图中包含的缓冲区数据吗?我看到 JNI 中有一个函数 GetDirectBufferAddress,但我能找到的文档表明它仅限于 java.nio.buffer。我可以使用此功能直接获取像素数据吗?也许通过获取 Bitmap 类使用的内部缓冲区?

我使用它来创建全局引用的 Java.nio.buffer 的唯一方法是每次我想更新时,将我的像素数据复制到其中,然后使用 copyPixelsFromBuffer 吗?这仍然涉及 2 个副本,但至少可以消除像素格式更改。这会比我已经在使用的方法更有效吗?

还有更好的方法吗?

顺便说一句,我AM知道我可以使用 中的函数,但我真的不想失去对 Android 2.1 和 Android 2.2 的支持...

提前干杯!

最佳答案

这是一个肮脏但有效的解决方案,适用于 Android 1.5 到 4.0。代码在 C++ 中。

                              //decls of some partial classes from Skia library
class SkRefCnt{
public:
virtual ~SkRefCnt(){}
private:
mutable int fRefCnt;
};

//----------------------------

class SkPixelRef: public SkRefCnt{
public:
virtual class Factory getFactory() const;
virtual void flatten(class SkFlattenableWriteBuffer&) const;
protected:
virtual void* onLockPixels(class SkColorTable**) = 0;
virtual void onUnlockPixels() = 0;
public:
void *GetPixels(){
SkColorTable *ct;
return onLockPixels(&ct);
}
};

jobject java_bitmap; //your Bitmap object
jclass java_bitmap_class = env.GetObjectClass(java_bitmap);
class SkBitmap;
SkBitmap *sk_bitmap = (SkBitmap*)env.CallIntMethod(java_bitmap, env.GetMethodID(java_bitmap_class, "ni", "()I"));
SkPixelRef *sk_pix_ref;
sk_pix_ref = (SkPixelRef*)((int*)sk_bitmap)[1];
// get pointer to Bitmap's pixel memory, and lenght of single line in bytes
int buffer_pitch = env.CallIntMethod(java_bitmap, env.GetMethodID(java_bitmap_class, "getRowBytes", "()I"));
void *buffer = sk_pix_ref->GetPixels();

关于java - 从 C 尽快填充 Android 位图中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7774037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com