edwalt 2015-05-20 02:12 采纳率: 0%
浏览 6476

Android中通过JNI传递图片数据的问题(IplImage和Bitmap)

我的C++代码在Visual Studio中运行是正常的,输入和输出图片如下:
图片说明

在安卓中使用native函数调用此C++代码,显示结果如下:
图片说明

部分代码如下:

c++

 int* SharedMatting::getResult(int w, int h){
    int intsize = w*h;
    int* outImage = new int[intsize];
    IplImage *tempp = new IplImage(outputMat);//outputMat is a 4channels Mat.
    int* pixalpha = new int[intsize*4];
    int* pixred = new int[intsize*4];
    int* pixgreen = new int[intsize*4];
    int* pixblue = new int[intsize*4];
    for(int i=0; i<(intsize); i++){
        pixalpha[i] = (int)tempp->imageData[i*4+3];
        pixblue[i] = (int)tempp->imageData[i*4+0];
        pixgreen[i] = (int)tempp->imageData[i*4+1];
        pixred[i] = (int)tempp->imageData[i*4+2];
        outImage[i] = (pixalpha[i] << 24) | (pixred[i] << 16) | (pixgreen[i] << 8) | pixblue[i];
    }
    return outImage;
}

main.cpp

 JNIEXPORT jintArray JNICALL Java_Matting (JNIEnv* env, jclass clas, jint w, jint h){
    int size = w * h;
    jintArray result = env->NewIntArray(size);
    int* resultemp = new int[size];
    resultemp = sm.getResult(w, h);
    env->SetIntArrayRegion(result, 0, size, resultemp);
    return result;
}

Java code with Android:

private MyTask mTask;
ImageView imgView;
int[] resultInt;
int w, h;

private class MyTask extends AsyncTask<String, Integer, String> {
    protected String doInBackground(String... params) {
        resultInt = SharedMat.Matting(w, h);
        return null;
    }

    protected void onPostExecute(String result) {
        Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        resultImg.setHasAlpha(true);
        resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
        imgView.setImageBitmap(resultImg);
    }
}

我觉得应该是图片数据传来传去传坏掉了?

  • 写回答

2条回答 默认 最新

  • tanlean123 2015-07-22 03:35
    关注
       uchar* ptr = myimg.ptr(0);
    
       for(int i=0; i<(intsize); i++){
           //pixalpha[i] = (int)tempp->imageData[i*4+3];
           //pixblue[i] = (int)tempp->imageData[i*4+0];
          // pixgreen[i] = (int)tempp->imageData[i*4+1];
          // pixred[i] = (int)tempp->imageData[i*4+2];
           pixalpha[i] = ptr[4*i+3];
           pixblue[i] = ptr[4*i+0];
           pixgreen[i] = ptr[4*i+1];
           pixred[i] = ptr[4*i+2];
    
           outImage[i] = ((pixalpha[i] << 24)&(0xff<< 24)) | (pixred[i] << 16) | (pixgreen[i] << 8) | pixblue[i];
       }
    

    估计是你直接操作数据没有定位好文件头ptr(0),这样改完OK了

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题