android4.0 USB Camera实例(五补充)jpg压缩
2014-06-27 18:06
155 查看
前一篇最后 我们说了一个直接将yuv转成jpg的函数 但是转换没有成功 原函数是yuv420转jpg的 研究了下发现
yuv420隔行扫描的的序列是这样的
YYYY
YYYY
UVUV
而yuv422的隔行扫描的序列是这样的
YU YV YU YV YU YV
所以将函数作如下修改
接口函数修改如下
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压缩
- android4.0 USB Camera实例(五)jpg压缩
- android4.0 USB Camera实例(五)jpg压缩
- android4.0 USB Camera示例(五个辅助)jpg压缩
- android4.0 USB Camera实例(三)UVC
- android4.0 USB Camera实例(一)JNI层
- android4.0 USB Camera实例(四)CMOS
- android4.0 USB Camera实例(六)ffmpeg mpeg编码
- android4.0 USB Camera实例(一)JNI层
- android4.0 USB Camera实例(三)UVC
- android4.0 USB Camera实例(四)CMOS
- android4.0 USB Camera实例(三)UVC
- android4.0 USB Camera实例(一)JNI层
- android4.0 USB Camera实例(三)UVC
- android4.0 USB Camera实例(六)ffmpeg mpeg编码
- WPF + USB Camera 学习实例
- android 4.0 USB Camera实例(二)应用层
- android 4.0 USB Camera实例(二)应用层
- android4.0 USB Camera示例(四)CMOS
- android 4.0 USB Camera实例(二)应用层