您的位置:首页 > 移动开发 > Android开发

android JNI解码内存中的JPEG图片

2014-12-31 09:48 260 查看
最近在android上使用cv做一些简单的图像处理,摄像头拍摄的照片是JPEG格式的,cv处理时会解码成bmp。3个选择:

1、图片保存在sdcard上,JNI再去读取文件。 最后的万不得以到办法。

2、图片在java层解码,再通过JNI传输给C++。图片分辨率为3264x2448,解出来的bmp图片大小为32M,放弃。

3、JNI传输jpeg buffer 给C++。 jpeg buffer只有2M左右,但是需要解决  解码内存jpeg图片的问题。

通过jni传下来的jpeg buffer,libjpeg竟然不支持,jpeg只支持文件系统上的文件输入。网上有人说turbo-jpeg可以, 编译链接以后,在手机上运行崩溃,找不到原因。

偶然间在在cv的头文件上看到 imdecode这个函数:

CV_EXPORTS_W Mat imdecode(InputArray buf,int flags);

遇到一个问题:

输入是 InputArray类型的,而存放JPEG数据的却是c++指针。

度娘告诉我,Mat继承自InputArray,把jpeg数据传给Mat,然后调用imdecode对解码Mat进行解码。

完整代码如下:

jint length = env->GetArrayLength(byteArray);      //取得jni buffer size。

         cv::Mat standimg1 = Mat(length,1,CV_8UC1);   Mat 分配空间

env->GetByteArrayRegion(byteArray,0,len,(jbyte *)(standimg1.data));    //Mat。data 即Mat存放数据的地址。

Mat standimg =  imdecode( standimg1, CV_LOAD_IMAGE_COLOR);   解码

if(standimg.empty()){
LOGD("read  image err. \n");
return -1;
}

LOGFI("%d %d ",standimg.rows,standimg.cols);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cv jpeg 内存图片 imdec