大佬教程收集整理的这篇文章主要介绍了android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
两种选择:
1.传递整数数组,操纵像素并将像素写回Bitmap. [41ms]
2.传递整个位图. [35MS]
我注意到,传递Bitmap比传递像素数组并将数组分配给Bitmap快约5ms.
问题是使用选项2我失去了蓝色并获得橙色代替我期待的蓝色.图像是ARGB,它似乎改为RGBA?可能是什么问题?
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);
以上是大佬教程为你收集整理的android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?全部内容,希望文章能够帮你解决android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。