yuv to jpeg

int write_JPEG_file (char * filename, unsigned char* yuvData, int quality,int image_width,int image_height)
{
     struct jpeg_compress_struct cinfo;
 
     struct jpeg_error_mgr jerr;
 
     FILE * outfile;    // target file 
     JSAMPROW row_pointer[1];  // pointer to JSAMPLE row[s] 
     int row_stride;    // physical row width in image buffer
     JSAMPIMAGE  buffer;
 
     unsigned char *pSrc,*pDst;
 
     int band,i,buf_width[3],buf_height[3];
     cinfo.err = jpeg_std_error(&jerr);
 
     jpeg_create_compress(&cinfo);
 
 
     if ((outfile = fopen(filename, "wb")) == NULL) {
         fprintf(stderr, "can‘t open %s\n", filename);
         exit(1);
     }
     jpeg_stdio_dest(&cinfo, outfile);
 
 
     cinfo.image_width = image_width;  // image width and height, in pixels
     cinfo.image_height = image_height;
     cinfo.input_components = 3;    // # of color components per pixel
     cinfo.in_color_space = JCS_RGB;  //colorspace of input image
 
     jpeg_set_defaults(&cinfo);
 
     jpeg_set_quality(&cinfo, quality, TRUE );
 
     //////////////////////////////
     cinfo.raw_data_in = TRUE;
     cinfo.jpeg_color_space = JCS_YCbCr;
     cinfo.comp_info[0].h_samp_factor = 2;
     cinfo.comp_info[0].v_samp_factor = 2;
     /////////////////////////
 
     jpeg_start_compress(&cinfo, TRUE);
 
     buffer = (JSAMPIMAGE) (*cinfo.mem->alloc_small) ((j_common_ptr) &cinfo,
                                 JPOOL_IMAGE, 3 * sizeof(JSAMPARRAY)); 
     for(band=0; band <3; band++)
     {
         buf_width[band] = cinfo.comp_info[band].width_in_blocks * DCTSIZE;
         buf_height[band] = cinfo.comp_info[band].v_samp_factor * DCTSIZE;
         buffer[band] = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo,
                                 JPOOL_IMAGE, buf_width[band], buf_height[band]);
     } 
 
     unsigned char *rawData[3];
     rawData[0]=yuvData;
     rawData[1]=yuvData+image_width*image_height;
     rawData[2]=yuvData+image_width*image_height*5/4;
 
     int src_width[3],src_height[3];
     for(int i=0;i<3;i++)
     {
         src_width[i]=(i==0)?image_width:image_width/2;
         src_height[i]=(i==0)?image_height:image_height/2;
     }
 
     //max_line一般为16,外循环每次处理16行数据。
     int max_line = cinfo.max_v_samp_factor*DCTSIZE; 
     for(int counter=0; cinfo.next_scanline < cinfo.image_height; counter++)
     {   
         //buffer image copy.
         for(band=0; band <3; band++)  //每个分量分别处理
         {
              int mem_size = src_width[band];//buf_width[band];
              pDst = (unsigned char *) buffer[band][0];
              pSrc = (unsigned char *) rawData[band] + counter*buf_height[band] * src_width[band];//buf_width[band];  //yuv.data[band]分别表示YUV起始地址
 
              for(i=0; i <buf_height[band]; i++)  //处理每行数据
              {
                   memcpy(pDst, pSrc, mem_size);
                   pSrc += src_width[band];//buf_width[band];
                   pDst += buf_width[band];
              }
         }
         jpeg_write_raw_data(&cinfo, buffer, max_line);
     }
 
 
     jpeg_finish_compress(&cinfo);
 
     fclose(outfile);
 
     jpeg_destroy_compress(&cinfo);
 
     return 0;
}
时间: 2024-10-16 21:46:42

yuv to jpeg的相关文章

矢量图、位图、RGB、YUV、JPEG、PNG的理解

开发的项目中缺少不了图形图像的支持,对图的使用场景也是极多的,但对其内部原理却一直处理模糊状态,抽时间做个整理吧,理一下相关的概念. 一.矢量图与位图 矢量图与位图均为图像的表述方式,矢量图可以理解为在我们口中描述图形的方法,比如:图A:一个半径10cm的绿色实心圆,重点包括:圆.实心.绿色.半径为10cm.圆心位置,这些信息只需要很少的字节即可记录图A,因而,矢量图所占空间较小:还有一个特点就是放大以后不会变形,因为不管放多大,其特征都是固定的.矢量图缺点也很明显,难以表述复杂场景.基于矢量图

Android Framework 记录之一

简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有深究,现在研究framework框架层了. 原文地址:http://blog.csdn.net/banketree/article/details/24718899 记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm 描述移动通信标识 CellIdentityLte 描述

mini2440 MJPG_STREAMER 产生问题

usb摄像头芯片是中芯微的zc0301pl, http://www.vimicro.com.cn/product/pdf/ZC301PL-1107-V10-EN.pdf [[email protected] bin-song]# usb 1-1.2: new full speed USB device using s3c2410-ohci and address 10 usb 1-1.2: New USB device found, idVendor=0ac8, idProduct=301b u

android camera 学习

总体介绍 Android Camera框架从整体上看是一个client/service架构.有两个进程,一个是client进程,可以看成AP端 ,主要包括Java代码和一些native层的c/c++代码:另一个是service进程,属于服务端,是native c/c++代码, 主要负责和linux kernel中的camera driver交互,搜集linux kernel中driver层传上来的数据,并交给显示系统(surface)显示.client 和 service 进程通过Binder机

《OpenCV:cvColor在OpenCV中的应用》

imgproc是OpenCV一个比较复杂的lib,我是分开介绍的,之前介绍过了滤波器.直方图.结构分析和形状描述三节,这次介绍一下图像的变换,OpenCV对于图像的变换又可分为几何变换和其他的变换,我这节先介绍一下其他的变换. 这部分的函数包括adaptiveThreshold,对图像进行自适应的阈值操作. 相应的也有更一般常用的阈值操作函数threshold. 这里还是详细介绍一下cvtColor,这个函数是用来进行颜色空间的转换,随着OpenCV版本的升级,对于颜色空间种类的支持也是越来越多

Android Framework 简介

Android Framework 简介 简介 之前的研究太偏向应用层功能实现了,很多原理不了解没有详记,结果被很多公司技术人员鄙视了,为了减少自己的短板,重新复习了一遍C++.java.Android的开发,现在开始研究应用框架层了. 记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm 描述移动通信标识 CellIdentit

framework结构

记录 1.下载源码,目录如下: 2.Android系统的层次如下: 3.项目目录简单分析如下: 4.telphony目录 文件 描述 CellIdentityCdma //描述电信通信标识 CellIdentityGsm 描述移动通信标识 CellIdentityLte 描述3G通信标识 CellIdentityWcdma 描述联通通信标识 CellInfo 手机信息(什么网络.是否已注册.记录时间) class CellInfoCdma extends CellInfo 电信通信手机信息 Ce

最简单的基于FFMPEG的图像编码器(YUV编码为JPEG)

伴随着毕业论文的完毕,这两天最终腾出了空暇,又有时间搞搞FFMPEG的研究了.想着之前一直搞的都是FFMPEG解码方面的工作,非常少涉及到FFMPEG编码方面的东西,于是打算研究一下FFMPEG的编码.在网上看了一些样例,发现要不然是难度稍微有些大,要不然就是类库比較陈旧,于是就决定自己做一个编码方面的样例,方便以后学习. 本文的编码器实现了YUV420P的数据编码为JPEG图片.本着简单的原则,代码基本上精简到了极限.使用了2014年5月6号编译的最新的FFMPEG类库. 程序非常easy,打

Sensor信号输出YUV、RGB、RAW DATA、JPEG【转】

本文转载自:http://blog.csdn.net/southcamel/article/details/8305873 简单来说,YUV: luma (Y) + chroma (UV) 格式, 一般情况下sensor支持YUV422格式,即数据格式是按Y-U-Y-V次序输出的RGB: 传统的红绿蓝格式,比如RGB565,其16-bit数据格式为5-bit R + 6-bit G + 5-bit B.G多一位,原因是人眼对绿色比较敏感.RAW RGB: sensor的每一像素对应一个彩色滤光片