libjpeg库编码图片为jpg(ffmpeg解码视频存储图片:RGB格式位图压缩为jpg格式图片)
2017-01-20 17:36
1081 查看
压缩流程(结合网上大家的资料以及libjpeg库的example.c示例:都大同小异):
1、如何分配和初始化一个jpeg压缩对象:
在libjpeg中jpeg压缩对象被定义为struct jpeg_compresss_struct这样一个结构体(在这个结构体中有一些子结构体,而这些子结构体是通过malloc来分配的); 另外我们还需要定义一个错误处理器struct jpeg_error_mgr结构体(错误处理器的作用是将jpeg库中的错误流输出到stderr,如果出现致命的错误就退出程序)。
例1:
struct jpeg_compress_struct cinfo;
strcut jpeg_error_mgrjerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
2、指定压缩数据保存的位置:
例2:
FILE *pOutfile =NULL;
if(pOutfile =fopen(strFileName,”wb”))
{
return;
}
jpeg_stdio_dest(&cinfo,pOutfile);
不能在jpeg_start_compress与jpeg_finish_compress之间更改数据保存的位置。
3. 设置压缩对象参数,这里主要需要设置的参数有:
cinfo.image_width;(图像的宽度,以像素为单位);
cinfo.image_height;(图像的高度,以像素为单位);
cinfo.input_components;(图像的索引,1代表灰阶图,2代表彩色图);
cinfo.in_color_space;(输入图像的色阶,JCS_GRAYSCALE代表灰阶,JCS_RGB代表彩色图像);
质量参数(0~100);
/===========================
第三个参数如果是灰度图,一定要设置成1,这个是貌似是通道数。对应的第四个参数一定要设置成JCS_GRAYSCALE。
如果是RGB图像,第三个参数设置成3,然后第四个参数设置成JCS_RGB。
再后面还有一句话
row_stride = jpegWidth ;
如果是灰度图,这条语句就没有问题,如果是RGB图,这个语句要改成
row_stride = jpegWidth*3 ;
彩色图像压缩,我一直没有实验成功,说明还有某些地方做的不正确。
/===========================
例3:
jpeg_set_default(&cinfo)//设置压缩参数;
jpeg_set_quality(&cinfo,100,TRUE)//设置质量参数;
4、开始压缩循环,逐行进行压缩:使用jpeg_start_compress开始一个压缩循环。
例4:
jpeg_start_compress(&cinfo,TRUE);
JSAMPROW pRow[1];
int iWidth = cinfo.image_width *cinfo. input_components;//一行数据所占的字节数
while(cinfo.next_scanline <cinfo.image_height)
{
pRow[0] =pData[cinfo.next_scanline*iWidth];//需要压缩成jpeg图片的位 图数据缓冲区
jpeg_write_scanlines(&cinfo,pRow,1);//参数:1表示写入一行
}
5、结束压缩循环:
例5:
jpeg_finish_compress(&cinfo);
6、释放jpeg压缩对象
jpeg_destorycompress(&cinfo);
fclose(pOutfile);
1、如何分配和初始化一个jpeg压缩对象:
在libjpeg中jpeg压缩对象被定义为struct jpeg_compresss_struct这样一个结构体(在这个结构体中有一些子结构体,而这些子结构体是通过malloc来分配的); 另外我们还需要定义一个错误处理器struct jpeg_error_mgr结构体(错误处理器的作用是将jpeg库中的错误流输出到stderr,如果出现致命的错误就退出程序)。
例1:
struct jpeg_compress_struct cinfo;
strcut jpeg_error_mgrjerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
2、指定压缩数据保存的位置:
例2:
FILE *pOutfile =NULL;
if(pOutfile =fopen(strFileName,”wb”))
{
return;
}
jpeg_stdio_dest(&cinfo,pOutfile);
不能在jpeg_start_compress与jpeg_finish_compress之间更改数据保存的位置。
3. 设置压缩对象参数,这里主要需要设置的参数有:
cinfo.image_width;(图像的宽度,以像素为单位);
cinfo.image_height;(图像的高度,以像素为单位);
cinfo.input_components;(图像的索引,1代表灰阶图,2代表彩色图);
cinfo.in_color_space;(输入图像的色阶,JCS_GRAYSCALE代表灰阶,JCS_RGB代表彩色图像);
质量参数(0~100);
/===========================
第三个参数如果是灰度图,一定要设置成1,这个是貌似是通道数。对应的第四个参数一定要设置成JCS_GRAYSCALE。
如果是RGB图像,第三个参数设置成3,然后第四个参数设置成JCS_RGB。
再后面还有一句话
row_stride = jpegWidth ;
如果是灰度图,这条语句就没有问题,如果是RGB图,这个语句要改成
row_stride = jpegWidth*3 ;
彩色图像压缩,我一直没有实验成功,说明还有某些地方做的不正确。
/===========================
例3:
jpeg_set_default(&cinfo)//设置压缩参数;
jpeg_set_quality(&cinfo,100,TRUE)//设置质量参数;
4、开始压缩循环,逐行进行压缩:使用jpeg_start_compress开始一个压缩循环。
例4:
jpeg_start_compress(&cinfo,TRUE);
JSAMPROW pRow[1];
int iWidth = cinfo.image_width *cinfo. input_components;//一行数据所占的字节数
while(cinfo.next_scanline <cinfo.image_height)
{
pRow[0] =pData[cinfo.next_scanline*iWidth];//需要压缩成jpeg图片的位 图数据缓冲区
jpeg_write_scanlines(&cinfo,pRow,1);//参数:1表示写入一行
}
5、结束压缩循环:
例5:
jpeg_finish_compress(&cinfo);
6、释放jpeg压缩对象
jpeg_destorycompress(&cinfo);
fclose(pOutfile);
实例:(下面函数接口是RGB格式位图压缩为jpg格式图片:与ffmpeg解码视频结合) //实现视频帧的jpeg压缩:首先ffmpeg解码视频为YUV420格式,先转码为RGB格式,这个过程在ffmpeg解码部分实现,这里不再详解。 void MyWriteJPEG2(AVFrame* pFrame, int width, int height, int iFrame) { char fname[128] = { 0 }; /* 分配和一个jpeg压缩对象 */ struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; JSAMPROW row_pointer[1]; int row_stride; uint8_t *buffer; FILE *fp; buffer = pFrame->data[0]; sprintf(fname, "%s%d.jpg", "frame", iFrame); /* 指定压缩数据保存的位置 */ fp = fopen(fname, "wb"); cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo);/* 初始化 */ jpeg_stdio_dest(&cinfo, fp); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; cinfo.in_color_space = JCS_RGB; /* 设置压缩参数 */ jpeg_set_defaults(&cinfo); /* 设置质量参数 */ jpeg_set_quality(&cinfo, 100, TRUE); /* 开始压缩循环,逐行进行压缩:使用jpeg_start_compress开始一个压缩循环 */ jpeg_start_compress(&cinfo, TRUE); row_stride = width * 3;/* 一行数据所占字节数:如果图片为RGB,这个值要*3.灰度图像不用 */ while (cinfo.next_scanline < height) { row_pointer[0] = &buffer[cinfo.next_scanline * row_stride];//需要压缩成jpeg图片的位 图数据缓冲区 (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);//参数:1表示写入一行 } jpeg_finish_compress(&cinfo);//结束压缩循环 fclose(fp); jpeg_destroy_compress(&cinfo);//释放jpeg压缩对象 printf("compress one picture success.\n"); return; }
相关文章推荐
- libjpeg库编码图片为jpg(ffmpeg解码视频存储图片:RGB格式位图压缩为jpg格式图片)
- libpng库编码图片为png(RGB压缩为png图片:与ffmpeg视频解码存储为png图片)
- C# 将截屏图片jpg转为YUV格式,再进行H264压缩成视频,求思路,求源码?
- ffmpeg实现将视频存储为图片jpg
- 使用FFmpeg把视频转换成JPG格式的图片
- 【FFMpeg视频开发与应用基础】三、调用FFmpeg SDK对H.264格式的视频压缩码流进行解码
- ffmpeg+SDL的使用之获取视频帧将其存储为PPM格式图片
- flash as3 抓取图片进行jpg编码压缩成jpg的ByteArray格式的二进制数据流发送到php
- 利用ffmpeg截取视频图像并保存为ppm和jpg图片格式
- 图像视频编码和FFmpeg(3)-----用FFmpeg进行图像格式转换和AVFrame简介
- 视频格式与编码压缩标准 mpeg4,H.264.H.265 有什么关系?
- FFmpeg 视频格式解码方法
- 图像视频编码和FFmpeg(6)-----用FFmpeg编码和解码的例子
- 关于位图行程编码格式压缩
- 图像视频编码和FFmpeg(4)-----h264格式简单介绍
- ffmpeg 重写tutorial01程序--将一个视频文件解码输出bmp和jpg文件
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
- 将RGB图像数据压缩成jpg格式图片的代码实现
- ffmpeg解码jpg并编码成h264