当前位置: 代码迷 >> Android >> android4.0 USB Camera范例(五补充)jpg压缩
  详细解决方案

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

热度:584   发布时间:2016-04-28 05:05:24.0
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);}
还是要静下心来研究

  相关解决方案