使用IJG库读写JPEG格式文件

来源:互联网 发布:白金数据1080p百度云 编辑:程序博客网 时间:2024/05/22 23:11

IJG全称为Independent JPEG Group,是一个用于处理JPEG文件格式的开源库。用于遥感和地理信息系统数据处理的GDAL就是用这个库进行JPEG格式解析的。


IJG的主页是http://www.ijg.org/,源代码和一些相关文档可以在http://www.ijg.org/files/下找到。


解压缩:

//变量定义

struct jpeg_decompress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * infile;
JSAMPARRAY buffer;
int row_stride;
//绑定标准错误处理结构
cinfo.err = jpeg_std_error(&jerr);
//初始化JPEG对象
jpeg_create_decompress(&cinfo);
//指定图像文件
if ((infile = fopen("sample.jpg", "rb")) == NULL) 
{
return;
}
jpeg_stdio_src(&cinfo, infile);
//读取图像信息
(void) jpeg_read_header(&cinfo, TRUE);
//设定解压缩参数,此处我们将图像长宽缩小为原图的1/2
cinfo.scale_num=1;
cinfo.scale_denom=2;
//开始解压缩图像
(void) jpeg_start_decompress(&cinfo);
 
//本程序功能是应用GDI+在客户区绘制图像
CClientDC dc(this); 
Bitmap bm( cinfo.output_width , cinfo.output_height);  
Graphics graphics(dc.GetSafeHdc());
Graphics gdc(&bm);
//分配缓冲区空间
row_stride = cinfo.output_width * cinfo.output_components;
buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
//读取数据
while (cinfo.output_scanline < cinfo.output_height)
{
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
//output_scanline是从1开始,所以需要减1
int line=cinfo.output_scanline-1;
for(int i=0;i<cinfo.output_width;i++)
{
//绘制位图,本例中假设读取的sample.jpg图像为RGB真彩色图像
//因此,实际上cinfo.output_components就等于3,灰度图则需另作处理
bm.SetPixel(i,line,Color(255,(BYTE)buffer[0][i*3],(BYTE)buffer[0][i*3+1],(BYTE)buffer[0][i*3+2]));
}
}
//结束解压缩操作
(void) jpeg_finish_decompress(&cinfo);
//释放资源
jpeg_destroy_decompress(&cinfo);
fclose(infile);
//在客户区绘制位图

graphics.DrawImage(&bm,0,0);


压缩:


//变量定义
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
FILE * outfile;
JSAMPROW row_pointer;
int row_stride;
//绑定标准错误处理结构
cinfo.err = jpeg_std_error(&jerr);
//初始化JPEG对象
jpeg_create_compress(&cinfo);
//指定目标图像文件
if ((outfile = fopen("dest.jpg", "wb")) == NULL)
{
return;
}
jpeg_stdio_dest(&cinfo, outfile);
//设定压缩参数
cinfo.image_width = image_width;
cinfo.image_height = image_height;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
//此处设压缩比为90%
jpeg_set_quality(&cinfo, 90, TRUE);
//开始压缩
jpeg_start_compress(&cinfo, TRUE);
//假设使用的是RGB图像
row_stride = image_width * 3;
//写入数据
while (cinfo.next_scanline < cinfo.image_height) 
{
row_pointer = image_buffer[cinfo.next_scanline];
(void) jpeg_write_scanlines(&cinfo, &row_pointer, 1);
}
//压缩完毕
jpeg_finish_compress(&cinfo);
//释放资源
fclose(outfile);
jpeg_destroy_compress(&cinfo);

原创粉丝点击