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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值