int fh_jpeg_load(char *filename, unsigned char *buffer, unsigned char ** alpha, int x, int y)
{
struct jpeg_decompress_struct cinfo; //JPEG对象
struct jpeg_decompress_struct *ciptr;
struct r_jpeg_error_mgr emgr; //于错误处理的结构体对象
unsigned char *bp;
int px, c;
FILE *fh;
JSAMPLE *lb; //JSAMPLE类型的缓冲区变量
ciptr = &cinfo;
if(!(fh=fopen(filename,"rb"))) return(FH_ERROR_FILE); //打开jpg文件
ciptr->err = jpeg_std_error(&emgr.pub); //将错误处理结构对象绑定在JPEG对象上。
emgr.pub.error_exit = jpeg_cb_error_exit;
if(setjmp(emgr.envbuffer))
{
jpeg_destroy_decompress(ciptr);
fclose(fh);
return(FH_ERROR_FORMAT);
}
jpeg_create_decompress(ciptr); //初始化ciptr结构
jpeg_stdio_src(ciptr, fh); //打开jpg文件
jpeg_read_header(ciptr, TRUE); //读取图像信息
ciptr->out_color_space = JCS_RGB; //设定输出图像的色彩空间,把一个原本彩色的图像由真彩色JCS_RGB变为灰度JCS_GRAYSCALE
jpeg_start_decompress(ciptr); //图像解压缩操作
px = ciptr->output_width; //输出图像宽度
c = ciptr->output_components; //每个像素中的颜色通道数 灰度为1,全彩色为3
if(c==3) //读取数据
{
lb = (JSAMPLE*)(*ciptr->mem->alloc_small)((j_common_ptr)ciptr, JPOOL_PERMANENT, c*px);//分配c*px行数据
bp = buffer;
while (ciptr->output_scanline < ciptr->output_height)
{
jpeg_read_scanlines(ciptr, &lb, 1); //当前已经读取的行数,如此即可依次读出图像的所有数据,并填充到缓冲区中,参数px*表示的是每次读取的行数
memcpy(bp, lb, px*c); //由lb所指内存区域复制px*c个字节到bp所指内存区域。
bp += px*c;
}
}
jpeg_finish_decompress(ciptr); //解压缩完毕
jpeg_destroy_decompress(ciptr); //释放资源
fclose(fh);
return(FH_ERROR_OK);
} 这是主要的解压缩函数 ,libjpeg依赖库要有,要是一直只在自己本机里面开发使用安装到本机即可 ,如果要拿给其他人用要变成自己代码里面的库,也就是能够直接调用而不用安装。(因为这个还被老师批了。。。)