android JNI解码内存中的JPEG图片

最近在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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值