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);
    }
}

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

1

2个回答

   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了

0

我也是出现这个问题,数据转了以后变得特别奇怪
楼主怎么解决的

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android JNI操作Bitmap实现黑白图片
最近想练习一下NDK,基于我接下来的目标是多媒体,多以想多点学习一下关于滤镜的知识,黑白滤镜是最简单的了。 这里实现的是将一张彩色图片转成黑白图片,是黑白滤镜的基础! 直接上码: // java 代码 public void gray(View view) { Bitmap source = BitmapFactory.decodeResource(getResources(), R.dr...
Android Jni OpenCV图片灰度处理
一,java代码,收集Bitmap 信息 public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btnProc; private ImageView imageView; private Bitmap bmp;// Used to load the 'n
Android-Intent传递数据(Bitmap)闪退问题
今天在启动Activity的时候突然出现了闪退问题,并且在logcat中没有出现异常,着实是摸不着头脑。 发现在传递bitmap的时候出现闪退,由于Bitmap数据量大导致的
Bitmap与IplImage之间的转换
在MFC编程中,用OpenCV来处理图像时,可能会进行Bitmap与IplImage之间的转换;所以在此留个记号,以免下次再用到的时候,还要去找。   IplImage* BitmapToIplImage(HBITMAP hBmp) { BITMAP bmp; GetObject(hBmp, sizeof(BITMAP), &amp;amp;bmp); int dep...
jni文件传递方法参数
使用jni从java传递多个参数到c++时,如果是多个参数,当是string类型时,参数之间用;分割 [code=&quot;c++&quot;] void sendToAndoridAdmobId(const char* id) { JniMethodInfo methodInfo; if (!JniHelper::getStaticMethodInfo(...
JNI下使用AndroidBitmap_lockPixels修改位图为黑白照片
这次使用的场景是QQ好友下线后头像变黑白 使用了NDK中提供的位图解析接口 android\bitmap.h库中的三个接口 并且一共也是三个接口 至少到目前为止是三个 关于这个库的接口 点击查看android-ndk-r9d\android\bitmap.h好友下线的效果图如下(图片尺寸900*675,位深度24) android部分代码 public class Ma
android人脸识别,jni中bitmap转BGR
前言:    在做Android人脸识别的过程中,不可避免的要对图片进行各种格式之间的转换,Android设备摄像头获取的视频帧是NV21(即YUV420sp)格式的,图片一般使用的是jpg,png格式的,算法需要的经常是YUV420sp或者是BGR格式的,并且不同的格式还有各自的排列顺序,这个就要看具体的算法设计了。        如上图所示,在android程序中,jpg格式的图片要传...
android如何高效的在native处理bitmap图像
opencv java
Android Java与JNI层互传数据总结
在开发中常常会遇到从Java层传递数据到JNI层,然后在JNI拿到数据后就可以用C语言进行操作了,操作完数据后通常还需要把处理后的数据传回Java层。下面分别进行小结。从Java层传到JNI层 使用GetByteArrayRegion的方式。 该方法的本质是将Java端数组数据拷贝到本地的数组中,所以在JNI对数据修改后Java端的数据并没有改变。 使用GetPrimitiveArrayCriti
Android上在两个Activity之间传递Bitmap对象
Android上在两个Activity之间传递Bitmap对象 因为我做Android应用的时间不长,所以当我第一次在android之间传递Bitmap对象的时候我直接用了Intent.putExtra的方法实现了,当时我选择的是一张图像的ROI区域,所以工作的很好,但是当我尝试将整个图片做为Bitmap对象传到另外一个Activity中的时候总是得到一...
Activity跳转时传递Bitmap对象
这是Activity跳转时传递Bitmap对象的一个Demo
Android传递Bitmap的两种简单方式及其缺陷
Android传递Bitmap的几种简单方式 一,通过Intent的Bundle。 比如有两个activity,A,B,从A进入B。先在A中将Bitmap写进去: Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.ic_launcher); Bund...
Intent/Bundle传递Bitmap的时候失败甚至崩溃
        在Android开发中,我们有时候需要传递一个Bitmap给一个Activity。我们最直接的做法便是通过Intent/Bundle来传递数据,因为Bitmap也已经实现了Parcelable接口。         但是,当你运行程序的时候,常常又会发现Bitmap并没有传递过去甚至程序直接崩溃了,那么这又是为什么呢?         其实,这绝大多数是由于Bitmap过大导致...
Android 通过jni返回Mat数据类型
Android 开发过程中为了实现代码的高效性,通常要调用本地c++代码,JNI是java语言提供的和c/c++相互沟通的机制,在使用opencv做图像处理时,通常要调用c/c++代码进行相关操作,将处理后的结果返回java进行显示或者其他操作。 可以在java部分创建一个Mat,用于保存图像处理结果图像,获取Mat 的本地地址传入jni函数中: // java Mat res = n
IplImage与Bitmap相互转换
Drawable drawable = idToDrawable(R.drawable.p4); Bitmap bitmap = this.drawableToBitmap(drawable); // 将Bitmap转化为IplImage IplImage iplImage = this.bitmapToIplImage(bitmap);
android activity跳转传输bitmap出错的解决方案
activity跳转通过intent传输bitmap在有的情况下会报如下异常SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy when publishing原因是因为intent.putExtra()方法,传了一个较大的bitmap,把bitmap缩小一些就可以了,网上压缩bitma
Java层与Jni层数据传递的几种方式
一、 从Java传递数组到Jni层 二、 从Jni层传递数组到Java层 三、 Direct Buffer 方式传递
android 点击图片通过jni在底层处理,然后在屏幕上显示
通过一个按钮,选择一张图片,通过jni 将图片信息传到底层,然后将处理后的数据传回安卓层,手写通用版的Android.mk ,让你迅速搭建一个工程测试你的底层代码,一个积分,绝对值得。
Java层与JNI层对象的相互传递
java层jar包: package com.kaixin; public class Java2Jni{ public static class Data{ public int nSrcLen; //[IN] public byte[] bSrcData; //[IN] public int nDstLen; ...
Android JNI 传递对象
jni初步入门后,在传递数据的时候,遇到一个需求:有多个数据需要在java与c代码之间进行传递。如果都做为函数参数传入,则函数很长很难看,并且多个数据的返回也不好实现。所以想到了把数据打包后传递这在C语言中就是结构体,在java中就是类了。 我们要做的工作就是,先确定要传递的数据,然后相应在C与java中定义相应的数据类型,然后通过jni进行数据对应。下面以一个例程来逐步说明。
利用AIDL注册service在进程之间传输图片
本例子利用AIDL实现了进程间图片的传输。基本流程是:client端发送请求,server端下载byte类型的数据并通过接口函数回传。由于底层是通过传输byte实现的,因此该例子还可以扩展为传输其他可与byte互相转换的复杂类型。基本原理 整个工程含两个module,一个是client端(即app),另一个是server端。 server端实质上是定义并注册了一个service类。系统内所有其他进程
android平台下基于ANativeWindow实现渲染bitmap图像
OpenGL ES 3.0学习实践 android平台下OpenGL ES 3.0从零开始 android平台下OpenGL ES 3.0绘制纯色背景 android平台下OpenGL ES 3.0绘制圆点、直线和三角形 android平台下OpenGL ES 3.0绘制彩色三角形 android平台下OpenGL ES 3.0从矩形中看矩阵和正交投影 android平台下OpenGL ES 3...
Android使用JNI实现Java与C之间传递数据
介绍Java如何将数据传递给C和C回调Java的方法。  java传递数据给C,在C代码中进行处理数据,处理完数据后返回给java。C的回调是Java传递数据给C,C需要用到Java中的某个方法,就需要调用java的方法。 Android中使用JNI七个步骤: 1.创建一个android工程 2.JAVA代码中写声明native 方法 public native String helloFr
安卓打开摄像头,通过jni将预览数据NV12传到底层,底层打印成图片
安卓打开摄像头,通过jni将预览数据NV12传到底层,底层打印成图片,也可以进行其他处理,将结果返回给安卓层
intent传递bitmap失效的问题
概述: 虽然 Bitmap implements Parcelable ,支持intent来传递,但是还是不建议这样传。网上有说大于40kB就会失效,但是我测试两张图片,一张是68kb的可以传,一张是152kb的就失效了,报android.os.TransactionTooLargeException异常。这说明intent对传递的数据是有大小限制的。 将bitmap转换成byte
android在jni中对SurfaceView显示一张图片
大致流程是,在java获得Bitmap 的相素值,再通过getSurface()拿到Surface,一起传到jni,在jni就可以直接用了。 public class SurfaceActivity extends Activity{ private MSurfaceView yuvsurfaceview; @Override protected void onCreat
使用intent传递bitmap对象
[code=&quot;java&quot;] /** * 存: i.putExtra(&quot;0&quot;, bitmap); * 取: i = getIntent(); bitmap= i.getParcelableExtra(&quot;0&quot;); */ [/code]
Android Camera 二 JNI JAVA和C/CPP图像数据传输流程分析
Android Camera 一 源码路径 Android Camera 二 JNI JAVA和C/CPP图像数据传输流程分析 Android Camera 三 CameraService 和 Client 链接到 HAL Android Camera 四 Camera HAL 分析 Android Camera 五 Camera HAL v1 Linux v4l2 一 应用层 Lin...
Activity间图片传递(3种方法)
1.第一种适合资源id间传递 2.第二种将图片系列化后传递 3.第三种适合图片较大的情况传递
Android JNI开发(5)--数据传递
首先JNI中的数据类型有基本数据类型和引用类型: 基本数据类型为:Java类型 JNI类型 描述 boolean jboolean unsigned 8 bits byte jbyte signed 8 bits char jchar unsigned 16 bits sh
JNI开发-Java传递对象到C/C+
       JNI开发有时需要Java把对象作为参数传递到C/C++,此篇主要讲解Java传递Student对象到C/C++; 1. 定义com.niubashaoye.simple.jni.StuInfo类 public class StuInfo { private int stuId; private String stuName; private int stuAge; p...
将Opencv java中的Mat通过jni传递到C++中的方法
public native void FindFeatures(long matAddrGr, long matAddrRgba); ... mRgba = new Mat(height, width, CvType.CV_8UC4); mGray = new Mat(height, width, CvType.CV_8UC1); mRg
android利用BitMap获得图片的像素数据
最近工作,涉及最多的就是对图片的处理:获取图片–图片压缩–图片中人脸检出–美妆人脸–展示图片等等流程。在这里,就不一一叙述了。下面主要是获取图片中像素的方法。代码如下:/** * 获得图片的像素方法 * * @param bitmap */ private void getPicturePixel(Bitmap bitmap) { int
在JNI与java之间传递数据
“Android Studio”下“JNI”开发(linux.ubuntu)过程 JNI常用函数大全 传递String字符串 #MainActivity.java: JNI jni = new jni();//实例化JNI对象 jni.helloFromC(&amp;amp;amp;quot;helloworld&amp;amp;amp;quot;);//调用本地方法 #JNI.java: public class JNI{ static{...
JNI开发:传递和返回String类型案例
           JNI简单的int类型传递参考:Android的NDK项目开发案例           此篇以案例来讲解JNI传递String参数并返回String返回值开发,Java函数传递“牛八少爷”到C/C++函数,C/C++函数给字符串追加“欢迎你!”,并返回追加后的字符串到java的函数;           主要代码如下:          java的native方法:  ...
Activity之间,Activity与Fragment之间传递Bitmap对象时程序崩溃的原因及解决办法
写在前面: 本人大四狗,在做毕业设计(一个仿网易云课堂的视频播放器)的时候遇到了几个问题,今天总结一下,避免以后再踏进同样地坑。引用一句俗语:人不能两次踏进一条河流。这篇博客主要总结第一个问题:Activity之间,Activity与Fragment之间传递Bitmap对象时程序崩溃的原因及解决办法。吹水就吹到这里了,下面进入主题。 效果图: 程序一打开先是一个闪屏页动画,主要在
【OpenCV】IplImag、HImage相互转换
代码如下: Hobject IplImageToHImage(IplImage *pImage) { Hobject Hobj; if (3 == pImage->nChannels) { IplImage *pImageRed,*pImageGreen,*pImageBlue; pImageRed = cvCreateImage(c
android studio下jni传递int,String,数组类型的参数
这篇文章主要讲Java通过jni调用c层时如何传递参数,如何在c的代码中回调Java的方法 上一篇   Android studio下jni的配置和第一个hello word程序   在上一个例子的基础上继续研究如何通过jni传递参数给c,其实传递参数很简单,先说一下步骤: 1、在Java中定义native的含参的方法 2、使用javah生成头文件 3、在头文件中找到我们
JNI中通过参数来传递数组返回值(C和java间)
     在jni中返回数组,一般是在jni中直接new一个byte数组,然后调用函数(*env)-&amp;gt;SetByteArrayRegion(env, bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接return bytearray就可以了。      另外一种是返回错误号,数据通过参数传出,但是java的基本数据类型是传值,对象...
USBCamera.zip
Android下通过jni获取usb摄像头yuv数据,并将其拷贝到java层解码为Bitmap显示到界面中