您的位置:首页 > 编程语言 > C语言/C++

c语言 图像显示jpeg

2015-07-01 08:31 337 查看
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依赖库要有,要是一直只在自己本机里面开发使用安装到本机即可 ,如果要拿给其他人用要变成自己代码里面的库,也就是能够直接调用而不用安装。(因为这个还被老师批了。。。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: