我正在尝试从 OpenGL ES 捕获帧缓冲区数据并从中创建图像,基本上是作为捕获屏幕截图的一种方式
我正在尝试通过 JNI 使用 BitmapFactory 类进行转换。这是我当前的代码:
size_t size = w * h;
uint8_t *pixels = new uint8_t[size];
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
jobject jbitmap = 0;
if(pixels != 0) {
JNIEnv * env = GetEnv(state_->activity->vm);
//create the jbyte array and fill in with the pixel data
int byte_array_length = w * h;
jbyteArray byte_array = env->NewByteArray(byte_array_length);
env->SetByteArrayRegion(byte_array, 0, byte_array_length, (jbyte *)pixels);
//get the BitmapFactory class
jclass bitmap_factory_class = loadExternalClass("android/graphics/BitmapFactory");
jmethodID decode_byte_array_method = env->GetStaticMethodID(bitmap_factory_class,
"decodeByteArray", "([BII)Landroid/graphics/Bitmap;");
//get the bitmap itself
jbitmap = env->CallStaticObjectMethod(bitmap_factory_class, decode_byte_array_method,
byte_array, 0, byte_array_length);
env->DeleteLocalRef(byte_array);
}
if(jbitmap == 0) {
Log("Could not create image from framebuffer to share");
}
基本上,代码试图做的是:
- 将opengl帧缓冲区捕获到像素数组中
- 创建大小为 W*H 的 jbyteArray
- 填充 jbytearray
- 获取 BitmapFactory 类
- 使用 jbytearray 调用 decodeByteArray 方法
但是jbitmap对象一直设置为0,这让我觉得BitmapFactory调用失败了,不知道为什么
用于将帧缓冲区捕获到像素数组中的相同代码(即:glReadPixels 调用)在 iOS 和 MacOSX 上使用没有问题,所以我认为问题不在于那里
那么,对我可能遗漏的内容有什么帮助吗?