JNI:来自unsigned char*的位图始终为null
JNI: Bitmap from unsigned char* always null
我想将一个图像(通过jni)从C++传递给android应用程序。我从一个unsigned char*
数组开始。此数组没有任何损坏;我甚至可以将它保存到ppm
文件中,并在笔记本电脑上正确显示。
然后,我使用以下函数将其转换为jByteArray
:
jbyteArray imgByte=as_byte_array(env,imgRaw,img.getRawImageSize());
...
jbyteArray as_byte_array(JNIEnv *env, unsigned char* buf, int len) {
jbyteArray array = env->NewByteArray (len);
env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf));
return array;
}
之后,我将这个jByteArray
发送到java端。这个变量已经被正确填充,正如我在LogCat:上打印它的十六进制值所看到的那样
07-01 18:02:45.941 7017-8238/com.myapp.myapp W/C++ side﹕ 798a95798b9677889371838d6b7d8664757e5d6e7860717b5e...
07-01 18:02:46.941 7017-8238/com.myapp.myapp W/Java side﹕ 798a95798b9677889371838d6b7d8664757e5d6e7860717b5e...
最后一步是在ImageView上显示它。为此,我做了以下代码(取自SO上的另一个问题):
public void setImageViewWithByteArray(final ImageView view, byte[] data) {
final Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (bitmap==null) {
Log.e(TAG,"Bitmap is NULL!");
view.setImageResource(R.drawable.abc_btn_radio_material);
}
else {
view.setImageBitmap(bitmap);
}
}
});
}
但CCD_ 5变量总是CCD_。我做错了什么?有没有调试decodeByteArray
的方法?
BitmapFactor.decodeByteArray用于解码压缩的图像数据,例如PNG文件的内容。
如果你的字节数组包含未压缩的RGB数据,那么你可以创建一个宽度和高度正确的可变位图,然后使用Bitmap.setPixels设置像素。然而,setPixels采用了一个具有32位ARGB值的int数组,从你的日志来看,你的字节阵列似乎包含每像素3个字节的RGB数据。
因此,您需要创建一个int数组,然后处理字节数组,并为每个字节三元组向int数组写入一个int值,例如:
intArray[i] = 0xff000000 |
(((int)data[i*3] & 255) << 16) | (((int)data[i*3+1] & 255) << 8) | ((int)data[i*3+2] & 255);
然后将其传递给setPixels。或者你可以在JNI端做这件事,并返回一个jintArray。
相关文章:
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- 如何从路径字符串加载Gdiplus::位图
- 在C++中使用Gdiplus创建透明位图
- 用C++压缩内存中的位图
- C++gdi::内存中的位图到PNG图像
- LoadImage 函数不适用于 ImageMagick 创建的位图图像
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 尝试从资源加载位图返回NULL,错误代码为1813
- JNI:来自unsigned char*的位图始终为null