两种选择:
1.传递整数数组, *** 纵像素并将像素写回Bitmap. [41ms]
2.传递整个位图. [35MS]
我注意到,传递Bitmap比传递像素数组并将数组分配给Bitmap快约5ms.
问题是使用选项2我失去了蓝色并获得橙色代替我期待的蓝色.图像是ARGB,它似乎改为RGBA?可能是什么问题?
方法1:
Java的
Bitmap out = Bitmap.createBitmap(wIDth,height,Config.ARGB_8888);int[] rgba = new int[wIDth*height];mSmasher.loadImage(imagePath,rgba,0);out.setPixels(rgba,wIDth,height);
JNI
JNIEXPORT voID JNICALL Java_com_vblast_smasher_Smasher_loadImage (jnienv *pEnv,jobject obj,Jstring jfilePath,jintArray jbgra,jint options){ jint* _bgra = pEnv->GetIntArrayElements(jbgra,0); const char *filePath = pEnv->GetStringUTFChars(jfilePath,0); if (NulL != filePath) { // init our output image Mat bgra(outputHeight,outputWIDth,CV_8UC4,(unsigned char *)_bgra); // bgra image manipulations } pEnv->ReleaseIntArrayElements(jbgra,_bgra,0); pEnv->ReleaseStringUTFChars(jfilePath,filePath);}
方法2:
JNIEXPORT voID JNICALL Java_com_vblast_smasher_Smasher_getLayersBitmap (jnienv *pEnv,jobject bitmap){ int ret; AndroIDBitmAPInfo info; voID* pixels = 0; if ((ret = AndroIDBitmap_getInfo(pEnv,bitmap,&info)) < 0) { LOGE("AndroIDBitmap_getInfo() Failed ! error=%d",ret); return; } if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888 ) { LOGE("Bitmap format is not RGBA_8888!"); return; } if ((ret = AndroIDBitmap_lockPixels(pEnv,&pixels)) < 0) { LOGE("AndroIDBitmap_lockPixels() Failed ! error=%d",ret); } // init our output image Mat mbgra(info.height,info.wIDth,pixels); mLayers[0].copyTo(mbgra); AndroIDBitmap_unlockPixels(pEnv,bitmap);}
解决方案05/23:
问题是当使用整数数组并将其传递给JNI时,字节顺序从ARGB(java)更改为BGRA(本机).这对于处理像素来说很好.但是,在锁定像素时传递实际的Bitmap对象,字节顺序没有改变,所以在修改像素数据后需要更改它.
cvtcolor(mbgra,mbgra,color_BGR2RGBA,4);解决方法 Opencv订单是BGR而不是RGB.我猜猜A是在正确的位置(或者你会看到半透明的图像),但蓝色和红色会互换. 总结
以上是内存溢出为你收集整理的android – 使用OpenCv蓝色的NDK位图 *** 作是橙色的吗?全部内容,希望文章能够帮你解决android – 使用OpenCv蓝色的NDK位图 *** 作是橙色的吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)