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依赖库要有,要是一直只在自己本机里面开发使用安装到本机即可 ,如果要拿给其他人用要变成自己代码里面的库,也就是能够直接调用而不用安装。(因为这个还被老师批了。。。)
相关文章推荐
- [C++ primer]第六章笔记-函数
- C++ 大规模程序设计 之 组件
- C语言字符串替换函数(strrpl)
- C语言编程
- C语言 基础60题(1)
- c++学习 - int 和 string 的相互转换
- 黑马程序员——C语言基础学习(一)---C语言中的基本概念总结
- c语言--基础001--while循环
- 在什么情况下,Java比C++慢很多?
- C++错误
- 0-1背包问题与动态规划的C/C++代码
- 全局变量的定义
- C++ 智能指针详解
- c++中输出十进制,十六进制,八进制。默认输出十进制的数据和左右对齐
- c++中的格式控制
- C语言 递归方法调用函数计算n!
- 关于VC++6.0中的字符串拼接函数strcat
- 筛素数
- C语言实现3个数的最小公倍数和最大公约数
- The MAX