Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用OpenCv保存时图像透明度变暗大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我创建了一个绘图应用程序,我允许用户绘制并保存图像以便以后重新加载以继续绘图.基本上,我将绘图作为位图传递给要保存的JNI图层,并将其加载到上一个图形中.

我正在使用OpenCv来编写和读取png文件.

我注意到图像的透明度方面有些奇怪.几乎看起来透明度是根据OpenCv上的黑色计算的?看一下附加的图像,包含透明胶片的行.

通过将int数组传递给本机代码来纠正透明度,无需进行颜色转换:

通过将Bitmap对象传递给本机代码增加透明度,需要进行颜色转换:

可能发生什么?

使用本机Bitmap保存图像获取像素方法

if ((error = AndroidBitmap_geTinfo(pEnv,jbitmap,&info)) < 0) {
    LOGE("AndroidBitmap_geTinfo() Failed! error:%d",error);
}

if (0 == error)
{
    if ((error = AndroidBitmap_lockPixels(pEnv,&pixels)) < 0) {
        LOGE("AndroidBitmap_lockPixels() Failed ! error=%d",error);
    }
}

if (0 == error)
{
    if (info.format == ANDROID_BITMAP_FORMAT_RGBA_8888)
    {
        LOGI("ANDROID_BITMAP_FORMAT_RGBA_8888");
    }
    else
    {
        LOGI("ANDROID_BITMAP_FORMAT %d",info.format);
    }

    Mat bgra(info.height,info.width,CV_8UC4,pixels);
    Mat image;

    //bgra.copyTo(imagE);

    // fix pixel order RGBA -> BGRA
    cvtColor(bgra,image,COLOR_RGBA2BGRA);

    vector<int> compression_params;
    compression_params.push_BACk(CV_IMWRITE_PNG_COMPRESSION);
    compression_params.push_BACk(3);

    // save image
    if (!imwrite(filePath,compression_params))
    {
        LOGE("saveImage() -> Error saving image!");
        error = -7;
    }

    // release locked pixels
    AndroidBitmap_unlockPixels(pEnv,jbitmap);
}

使用NativE int像素数组方法保存图像:

JNIEXPORT void JNICALL Java_com_vblast_smasher_smasher_saveImageRaw
    (jnienv *pEnv,jobject obj,jString jFilePath,jintArray jbgra,jint options,jint compression)
{
    jint*  _bgra = pEnv->GeTintArrayElements(jbgra,0);
    const char *filePath = pEnv->GetStringUTFChars(jFilePath,0);

    if (NULL != filePath)
    {
        Mat image;
        Mat bgra(outputHeight,outputWidth,(unsigned char *)_bgra);

        bgra.copyTo(imagE);

        if (0 == options)
        {
            // replace exisTing cache value
            mpCache->insert(filePath,imagE);
        }

        vector<int> compression_params;
        compression_params.push_BACk(CV_IMWRITE_PNG_COMPRESSION);
        compression_params.push_BACk(compression);

        // save image
        if (!imwrite(filePath,imagE))
        {
            LOGE("saveImage() -> Error saving image!");
        }
    }

    pEnv->ReleaseIntArrayElements(jbgra,_bgra,0);
    pEnv->ReleaseStringUTFChars(jFilePath,filePath);
}

更新05/25/12:
经过一番研究后,我发现如果我从位图获取像素的int数组并将其直接传递给JNI,而不是我目前将整个Bitmap传递给JNI,那么这个问题就不会发生.然后获取像素并使用cvtColor正确转换像素.我使用正确的像素转换吗?

解决方法

有两种方法可以表示RGBA像素中的alpha,预乘还是不是.通过预乘,R,G和B值乘以alpha:color =(color * alpha)/ 255的百分比.这简化了大量的混合计算,并且通常在成像库内部使用.在保存为不使用预乘alpha的格式(例如PNG)之前,颜色值必须为“unmultiplied”:color =(255 * color)/ alpha.如果不是,颜色看起来会太暗;颜色越透明,颜色越深.这看起来就像你在这里看到的效果.
@H_675_35@

大佬总结

以上是大佬教程为你收集整理的使用OpenCv保存时图像透明度变暗全部内容,希望文章能够帮你解决使用OpenCv保存时图像透明度变暗所遇到的程序开发问题。

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

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