• 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
    ",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);
    }
    还是静下心来研究

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    C/C++ 知识点---存储区
    Objective-C中的@property和@synthesize用法
    C/C++ 知识点---数组与指针
    C/C++ 知识点---C语言关键字(32个)
    js里json和eval()
    js--冒泡排序
    js数学公式-曲线运动
    事件绑定兼容(事件流的机制;事件委托
    2 获取元素在页面中的位置
    Dom关于位置和尺寸的api
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4621648.html
Copyright © 2020-2023  润新知