android4.0 USB Camera示例(五个辅助)jpg压缩
2015-07-05 08:04
459 查看
前的最后一个 我们说,一个直接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); }还是静下心来研究
相关文章推荐
- Android截图
- Android studio中导入开源库出现com.android.ide.common.process.ProcessException 错误
- android依赖注入框架Dagger和Butterknife实战
- Android中万能的适配器的详细讲解(附源代码)
- android开发之一如何升级SDK
- 【Android】ImageView的src和background的区别以及两者的妙用
- 史上最详细的Android Studio系列教程三--快捷键
- 史上最详细的Android Studio系列教程四--Gradle基础
- android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
- Activity内部Handler引起内存泄露的原因分析
- Android TimeLine 类时间戳,时间轴控件。
- android 布局中 gravity 和 layout_gravity 属性
- Android下的Junit单元测试
- Android5.1 - 通讯录建立群组
- android PopupWindow 自适应宽度
- android 通过获得dimens.xml中定义的大小来设置字体的大小
- android 内存优化方法
- Android开发使用MediaRecorder进行录音
- Android 内存管理 &Memory Leak & OOM 分析
- Android的帧动画补间动画,新手复习