YCbCr 转 RGB 保存成JPEG文件
来源:互联网 发布:acr软件下载 编辑:程序博客网 时间:2024/04/25 06:35
/**
通过YCbCr保存成Jpeg文件
YCbCr采样格式为 4:2:0;(Y:16*16 Cb:8*8 Cr:8*8)
yuvData:图像数据宽度高度都要归一化为16的倍数,
*/
void write_YUV_JPEG_file (char * filename, char* yuvData, int quality,
int image_width,int image_height)
{
try
{
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;
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.do_fancy_downsampling=FALSE;
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]);
}
char *rawData[3];
rawData[0]=yuvData;
rawData[1]=yuvData+image_width*image_height;//100*124;//
rawData[2]=yuvData+image_width*image_height*5/4;//iImageWidthCb*iImageHeightCb;//rawData[1]+52*62;//
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 = buf_width[band];
unsigned char *pDst = (unsigned char *) buffer[band][0];
unsigned char *pSrc = (unsigned char *) (rawData[band] + //yuv.data[band]分别表示YUV起始地址
counter*buf_height[band] * buf_width[band]);
for(i=0; i<buf_height[band]; i++)
{
memcpy(pDst, pSrc, mem_size);
pSrc += 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);
}
catch(...)
{
DisplayMsg(_T("error dd"));
}
}
通过YCbCr保存成Jpeg文件
YCbCr采样格式为 4:2:0;(Y:16*16 Cb:8*8 Cr:8*8)
yuvData:图像数据宽度高度都要归一化为16的倍数,
*/
void write_YUV_JPEG_file (char * filename, char* yuvData, int quality,
int image_width,int image_height)
{
try
{
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;
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.do_fancy_downsampling=FALSE;
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]);
}
char *rawData[3];
rawData[0]=yuvData;
rawData[1]=yuvData+image_width*image_height;//100*124;//
rawData[2]=yuvData+image_width*image_height*5/4;//iImageWidthCb*iImageHeightCb;//rawData[1]+52*62;//
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 = buf_width[band];
unsigned char *pDst = (unsigned char *) buffer[band][0];
unsigned char *pSrc = (unsigned char *) (rawData[band] + //yuv.data[band]分别表示YUV起始地址
counter*buf_height[band] * buf_width[band]);
for(i=0; i<buf_height[band]; i++)
{
memcpy(pDst, pSrc, mem_size);
pSrc += 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);
}
catch(...)
{
DisplayMsg(_T("error dd"));
}
}
- YCbCr 转 RGB 保存成JPEG文件
- JPG-JPEG(JFIF)文件解码—YCbCr与RGB
- RGB转YCbCr
- 图像处理 YCbCr转RGB
- opencv中RGB转YCbCr
- RGB 与 (RGB转 YCbCr再转为 RGB)的图像
- 将RGB数组在内存中压缩成JPEG文件
- RGB YCbCr 转换
- RGB、YUV和YCbCr
- RGB、YUV和YCbCr
- RGB、YUV和YCbCr
- RGB、YUV和YCbCr
- RGB YUV YCbCr
- RGB、YUV和YCbCr
- YCbCr与RGB转换
- RGB、YUV和YCbCr
- RGB、YUV和YCbCr
- RGB转化为YCbCr
- NS3安装过程
- setsockopt函数的用法
- 详解CSS选择器、优先级与匹配原理
- timus 1005 stone pile
- 【android基础】android preferences
- YCbCr 转 RGB 保存成JPEG文件
- 最好的shell入门教程
- centos wget
- centOS install mysql
- DM6446开发攻略——u-boot-1.3.4移植(1)
- 控件布局通用解决方案
- linux之udev
- [jtable]多个源码实例
- 软件工程概述 - 企业架构 - IT企业做大做强之根本