Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在测试使用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是在正确的位置(或者你会看到半透明的图像),但蓝色和红色会互换.
@H_801_45@

大佬总结

以上是大佬教程为你收集整理的android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?全部内容,希望文章能够帮你解决android – 使用OpenCv蓝色的NDK位图操作是橙色的吗?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。