android4.0 USB Camera实例(五补充)jpg压缩

前一篇最后 我们说了一个直接将yuv转成jpg的函数 但是转换没有成功 原函数是yuv420转jpg的 研究了下发现

yuv420隔行扫描的的序列是这样的

YYYY

YYYY

UVUV

而yuv422的隔行扫描的序列是这样的

YU YV YU YV YU YV

所以将函数作如下修改

static int put_jpeg_yuv420p_memory(unsigned char *dest_image,
                                   unsigned char *input_image, int width, int height)
{
    int i, j, jpeg_image_size;

    JSAMPROW y[16],cb[16],cr[16]; // y[2][5] = color sample of row 2 and pixel column 5; (one plane)
    JSAMPARRAY data[3]; // t[0][2][5] = color sample 0 of row 2 and column 5

    struct jpeg_compress_struct cinfo;
    struct jpeg_error_mgr jerr;
  	char *pbuf = NULL;
	int jpglen = 0;
    data[0] = y;
    data[1] = cb;
    data[2] = cr;

    cinfo.err = jpeg_std_error(&jerr);  // errors get written to stderr 

    jpeg_create_compress(&cinfo);
    cinfo.image_width = width;
    cinfo.image_height = height;
    cinfo.input_components = 3;
    jpeg_set_defaults (&cinfo);

    jpeg_set_colorspace(&cinfo, JCS_YCbCr);

    cinfo.raw_data_in = TRUE;                  // supply downsampled data
    cinfo.do_fancy_downsampling = FALSE;       // fix segfaulst with v7
    cinfo.comp_info[0].h_samp_factor = 2;
    cinfo.comp_info[0].v_samp_factor = 2;
    cinfo.comp_info[1].h_samp_factor = 1;
    cinfo.comp_info[1].v_samp_factor = 1;
    cinfo.comp_info[2].h_samp_factor = 1;
    cinfo.comp_info[2].v_samp_factor = 1;

    jpeg_set_quality(&cinfo, 80, TRUE);
    cinfo.dct_method = JDCT_FASTEST;

    jpeg_mem_dest(&cinfo, &pbuf, &jpglen);    // data written to mem

    jpeg_start_compress (&cinfo, TRUE);

    for (j = 0; j < height; j += 16) {
        for (i = 0; i < 16; i++) {
            y[i] = input_image + width * (i + j);
                //cb[i/2] = input_image + width * height + width / 2 * ((i + j) / 2);
                //cr[i/2] = input_image + width * height + width * height / 4 + width / 2 * ((i + j) / 2);
            if (i%2 == 0)
                cb[i/2] = input_image + width * ((i + j) / 2);
			else
				cr[i/2] = input_image + width * ((i + j) / 2);
        }
        jpeg_write_raw_data(&cinfo, data, 16);
    }

    jpeg_finish_compress(&cinfo);
    jpeg_destroy_compress(&cinfo);
    memcpy(dest_image,pbuf,jpglen);
	if(pbuf)
		free(pbuf);
    return jpglen;
}

即可将yuv422直接转化成jpg

接口函数修改如下

JNIEXPORT jint JNICALL Java_com_hclydao_usbcamera_Fimcgzsd_writefile(JNIEnv * env, jclass obj,jbyteArray yuvdata,jbyteArray filename)//jintArray rgbdata
{
	jbyte *ydata = (jbyte*)(*env)->GetByteArrayElements(env, yuvdata, 0);
	jbyte *filedir = (jbyte*)(*env)->GetByteArrayElements(env, filename, 0);

	FILE * outfile;
  	if ((outfile = fopen(filedir, "wb")) == NULL) {
    	LOGE("++++++++++++open %s failed\n",filedir);
    	return -1;
  	}

	unsigned char* dst = malloc(mwidth*mheight*3*sizeof(char));
	int size = put_jpeg_yuv420p_memory(dst,ydata,mwidth,mheight);
	fwrite(dst,size,1,outfile);
	if(dst)free(dst);
	if(jpgdata)free(jpgdata);
	fclose(outfile);
	(*env)->ReleaseByteArrayElements(env, yuvdata, ydata, 0);
	(*env)->ReleaseByteArrayElements(env, filename, filedir, 0);
}

还是要静下心来研究

android4.0 USB Camera实例(五补充)jpg压缩,布布扣,bubuko.com

时间: 2025-01-03 08:49:47

android4.0 USB Camera实例(五补充)jpg压缩的相关文章

android4.0 USB Camera实例(五)jpg压缩

最近大部分时间都在研究usb 摄像头顺便把jpg编码也写上 下面大部分函数都是我在网上找的 然后稍微的改一点就可以使用了 不过找这些函数费了不少时间 jpg编码网上有很多说明 大致流程都是一样的 我也没深入研究这里就不说了 接前面几篇Camera的文章 这里主要同把获取到的yuv数据通过jpg压缩 以及压缩成mjpeg视频流 首先说明下摄像头获取到的数据格式是yuv422(p16) 这个是在你初始化摄像头设置pixelformat我们当初设置的是V4L2_PIX_FMT_YUYV它的实际格式就是

android4.0 USB Camera实例(四)CMOS

上一篇说了下usb camera uvc标准的 顺便把CMOS做到一起 操作上基本一至 上一篇HAL层里我已经提供了CMOS的相关接口 JNIEXPORT jint JNICALL Java_com_dao_usbcam_Fimcgzsd_yuvtorgb 如果使用和UVC一样的处理 图像显示不出来 所以用另外一种方法 同时这里使用的是斯道ICOOL210开发板测试的 如果使用CMOS还需要修改一些地方 HAL层修改如下 首先增加一个函数如下 int select_input(int input

android4.0 USB Camera实例(六)ffmpeg mpeg编码

前面本来说是做h264编码的 研究了两天发现ffmpeg里的h264编码似乎是要信赖第三方库x264 还是怎么简单怎么来吧所以就整了个mpeg编码 ffmpeg移植前面我有一篇ffmpeg解码里已经给了 具体链接在这http://blog.csdn.net/hclydao/article/details/18546757 怎么使用那里面也已经说了 这里主要是通过ffmpeg将yuv422格式转换成rgb 然后就是yuv422转成mpeg格式 接前面几篇 获取到yuv422数据后 为了能显示出来

android4.0 USB Camera示例(五个辅助)jpg压缩

前的最后一个 我们说,一个直接yuv变成jpg该功能 但是转换不成功 主要功能是yuv420转jpg的 根据研究发现 yuv420的序列是这种 YYYY YYYY UVUV 而yuv422的隔行扫描的序列是这种 YU YV YU YV YU YV 所以将函数作例如以下改动 static int put_jpeg_yuv420p_memory(unsigned char *dest_image, unsigned char *input_image, int width, int height)

android4.0 USB Camera实例(三)UVC

passport.baidu.com/?business&un=%5F%E5%B0%8F%E5%A7%90%E8%8E%B1%E9%98%B3%E6%8F%B4%E4%BA%A4#0 passport.baidu.com/?business&un=%5F%E5%B0%8F%E5%A7%90%E6%B5%B7%E9%98%B3%E6%8F%B4%E4%BA%A4#0 passport.baidu.com/?business&un=%E5%8C%85%E5%A4%9C%5F%E8%8E

玩转Android Camera开发(五):基于Google自带算法实时检测人脸并绘制人脸框(网络首发,附完整demo)

本文主要介绍使用Google自带的FaceDetectionListener进行人脸检测,并将检测到的人脸用矩形框绘制出来.本文代码基于PlayCameraV1.0.0,在Camera的open和preview流程上进行了改动.原先是放在单独线程里,这次我又把它放到Surfaceview的生命周期里进行打开和开预览. 首先要反省下,去年就推出了静态图片的人脸检测demo,当时许诺一周内推出Camera预览实时检测并绘制的demo,结果拖到现在才整.哎,屌丝一天又一天,蹉跎啊.在demo制作过程中

【转】Android Camera(五)使用Camera功能 AREA的理解

http://blog.csdn.net/think_soft/article/details/7998478 使用Camera功能 大多数的Camera功能都是使用Camera.Parameters对象来激活和控制的.首先要通过Camera对象实例的getParameters()方法,来获取这个对象,然后把修改后的参数对象再设置给Camera对象,以下示例代码演示了这个操作: // get Camera parameters Camera.Parameters params = mCamera

一个Activity掌握Android4.0新控件 (转)

原文地址:http://blog.csdn.net/lavor_zl/article/details/51261380 谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种. 1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Switch处于关闭状态时: 当Switch处于打开状态时: 怎么在定义xml中定义Switch <Switch android:id="@+id/_switch" andr

Android4.0新控件

谷歌在推出Android4.0的同时推出了一些新控件,Android4.0中最常用的新控件有下面5种.  1. Switch的使用 Switch顾名思义,就是开关的意思,有开和关两种状态. 当Switch处于关闭状态时:  当Switch处于打开状态时:  怎么在定义xml中定义Switch <Switch android:id="@+id/_switch" android:layout_width="match_parent" android:layout_