libjpeg函数库介绍

JPEG是CCITT和ISO定义的一种连续调图像压缩标准[2]。JPEG是一种有损图像压缩标准,其基础是DCT变换(离散余弦变换)。JPEG图像的压缩过程分为三步:DCT计算,量化,变长编码分配。尽管CCITT定义了JPEG图像压缩标准,但是却并没有为JPEG定义标准的文件格式。这导致了现实世界中出现了各种各样的JPEG文件格式,而一种被称为JFIF的JPEG文件格式逐渐成为JPEG文件格式的主流。
libjpeg是一个被广泛使用的JPEG压缩/解压缩函数库(至少在Unix类系统下是广泛使用的),它能够读写JFIF格式的JPEG图像文件,通常这类文件是以.jpg或者.jpeg为后缀名的。通过libjpeg库,应用程序可以每次从JPEG压缩图像中读取一个或多个扫描线(scanline,所谓扫描线,是指由一行像素点构成的一条图像线条),而诸如颜空间转换、降采样/增采样、颜量化之类的工作则都由libjpeg去完成了。
要使用libjpeg,需要读者对数字图像的基本知识有初步的了解。对于libjpeg而言,图像数据是一个二维的像素矩阵。对于彩图像,每个像素通常用三个分量表示,即R(Red)、G(Green)、B(Blue)三个分量,每个分量用一个字节表示,因此每个分量的取值范围从0到255;对于灰度图像,每个像素通常用一个分量表示,一个分量同样由一个字节表示,取值范围从0到255。由于本文不会涉及到索引图像,因此这里略去对索引图像的说明。
在libjpeg中,图像数据是以扫描线的形式存放的。每一条扫描线由一行像素点构成,像素点沿着扫描线从左到右依次排列。对于彩图像,每个分量由三个字节组成,因此这三个字节以R、G、B的顺序构成扫描线上的一个像素点。一个典型的扫描线形式如下: R,G,B,R,G,B,R,G,B,…通过libjpeg解压出来的图像数据也是以扫描线的形式存放的。
在本文中,只涉及到JPEG的解压缩,因此只对libjpeg的解压过程进行说明,有关libjpeg的压缩过程和其它高级用法,请参考[3]。一般地,libjpeg的解压过程如下:
1、分配并初始化一个JPEG解压对象(本文中将JPEG解压对象命名为cinfo):
    struct jpeg_decompress_struct cinfo;
    struct jpeg_error_mgr jerr;
    ...
止水橡皮    = jpeg_std_error(&jerr);
    jpeg_create_decompress(&cinfo);
2、指定要解压缩的图像文件:
    FILE * infile;
周涵 成都书店
    ...
    if ((infile = fopen(filename, "rb")) == NULL) {
        fprintf(stderr, "can't open %s\n", filename);
        exit(1);
    }重庆创模
    jpeg_stdio_src(&cinfo, infile);
3、调用jpeg_read_header()获取图像信息:
    jpeg_read_header(&cinfo, TRUE);
4、这是一个可选步骤,用于设置JPEG解压缩对象cinfo的一些参数,本文可忽略;
5、调用jpeg_start_decompress()开始解压过程:
    jpeg_start_decompress(&cinfo);
调用jpeg_start_decompress()函数之后,JPEG解压缩对象cinfo中的下面这几个字段将会比较有用:
output_width                这是图像输出的宽度
output_height                这是图像输出的高度
output_components              每个像素的分量数,也即字节数
这是因为在调用jpeg_start_decompress()之后往往需要为解压后的扫描线上的所有像素点分配存储空间,这个空间的大小可以通过output_width * output_componets确定,而要读取的扫描线的总数为output_height行。
6、读取一行或者多行扫描线数据并处理,通常的代码是这样的:
      while (cinfo.output_scanline < cinfo.ouput_height) {农业生产合作社示范章程草案
              jpeg_read_scanlines();
              /* deal with scanlines */
半带滤波器>阿姆斯特朗      }
对扫描线的读取是按照从上到下的顺序进行的,也就是说图像最上方的扫描线最先被jpeg_read_scanlines()读入存储空间中,紧接着是第二个扫描线,最后是图像底边的扫描线被读入存储空间中。
7、调用jpeg_finish_decompress()完成解压过程:
    jpeg_finish_decompress(&cinfo);
8、调用jpeg_destroy_decompress()释放JPEG解压对象cinfo:
    jpeg_destroy_decompress(&cinfo);
以上就是通过libjpeg函数解压JPEG压缩图像的基本过程,由于本文不涉及libjpeg的高级特性和用法,因此,上面的介绍对于说明本文中要用到的libjpeg的功能已经足够了。

本文发布于:2024-09-20 17:23:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/316035.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   扫描线   解压   过程
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议