c 语言程序 图像,c语言 图像显示jpeg

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依赖库要有,要是一直只在自己本机里面开发使用安装到本机即可 ,如果要拿给其他人用要变成自己代码里面的库,也就是能够直接调用而不用安装。(因为这个还被老师批了。。。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值