android – 使用OpenCv蓝色的NDK位图 *** 作是橙色的吗?

android – 使用OpenCv蓝色的NDK位图 *** 作是橙色的吗?,第1张

概述我正在测试使用OpenCv *** 作JNI层上的位图像素的性能. 两种选择: 1.传递整数数组, *** 纵像素并将像素写回Bitmap. [41ms] 2.传递整个位图. [35MS] 我注意到,传递Bitmap比传递像素数组并将数组分配给Bitmap快约5ms. 问题是使用选项2我失去了蓝色并获得橙色代替我期待的蓝色.图像是ARGB,它似乎改为RGBA?可能是什么问题? 方法1: Java的 Bitmap 我正在测试使用OpenCv *** 作JNI层上的位图像素的性能.

两种选择:
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位图 *** 作是橙色的吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1128609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存