2.www.ijg.org/files/ jpegsrc.v6b.tar.gz 是linux的libjpeg的packet
或者在redhat 的光盘中有两个文件 libjpeg 和libjpeg-devel
3.http://www-900.ibm.com/developerWorks/cn/linux/game/image/image_format/index.shtml
Internet常见图像格式及其在 Linux 上的处理(一) kerberos
许多应用程序需要处理 Internet 上的图象信息。这些图象信息通常以特定的格式保存,常见的有 GIF、JPEG、PNG 等等。由于各种图象文件格式的特殊性,大大增加了编程处理的难度。为了帮助开发人员理解和处理这些图象信息,本文介绍了常见的图形格式以及相关概念,并介绍了如何在 Linux 系统中使用已有的图象处理函数库方便处理这些图象。全文共分两部分。第一部分介绍了 Internet 上常见的三种图像格式:GIF、JPEG、PNG;第二部分介绍这些图象的编程处理。 1简介 最简单、最常见同时也是最容易处理的图像文件格式莫过于位图,一个位图文件记录了图像的宽度、长度、色深以及以RGB方式表示的每一象素的颜色。位图是一种基本的图像格式,所以在许多平台上,包括Windows、X Window、MacOS上都提供了大量处理位图的API。由于位图是使用RGB方式描述一个像素点的颜色,所以位图的体积很大,相对于有限的网络带宽来说,要传输一副位图,会浪费很多的网络资源。当然,你可能会说,何不使用压缩算法压缩之后进行传输?很好,使用压缩技术的确可以减小图像的体积,以后我们介绍的几种图像的格式中,都使用了压缩的技术。但是,基于RGB颜色描述一个像素的方式导致了位图这种图像的先天不足,同样使用压缩技术,还有很多的颜色表示方法比RGB更优秀。 对于颜色的表示,一种非常简洁的方法是使用颜色索引,所谓颜色索引是在图像的文件中提供一个或者多个调色板,调色板用RGB方式记录了整幅图像用到的所有的颜色,图像中的象素的颜色就通过调色板的索引来表示。这样,就大大减小了图像文件的体积,再配合压缩技术,图像的体积还可以减小。 在图像中使用的压缩有有损压缩和无损压缩两种压缩方式,有损压缩的图像,压缩比比较大,但是图像会有失真,因为它是使用了与像素相近的颜色来代替像素的真实的颜色,这样节省了色彩空间,jpeg图像就是典型的有损压缩的图像,其压缩比甚至高达20:1。无损压缩仅仅是对存储像素的颜色的数据进行压缩压缩以后的数据在显示的时候还需要解码器进行还原。在gif、png等图像格式中,都使用了一些这样的算法。 2 图像格式简介 2.1gif CompuServe公司制定的Gif 图像格式的全称是 'GraphicsInterchangeFormat' ,顾名思义,是为Internet上传输高质量的图像。它共有两个版本:gif87a 和gif89a。在Gif图像格式中,所有的数据都是以流的方式传送的,并且Gif 定义了许多分隔符把数据流分割成数据块。Gif数据块主要有以下几种:
Gif图像最多可支持256色,在光栅数据数据块中,使用了LZW压缩算法对光栅数据进行压缩。在图像控制数据块中,还定义了gif 图像的扫描顺序是否是交错扫描,这样在网络传输速度比较慢的情况下,允许一幅gif图像可以先显示主要的部分,最后显示出全部。 对于gif图像的处理,我们需要编写解码器来处理不同的数据块,把它转换成方便应用程序处理的格式。解码器的编写十分复杂,但是linux 下已经有很多方便自由的处理库,libgif 就是其中的佼佼者。我们可以直接使用这些函数库。后面面,我们会介绍一下libgif 的使用。或者如果你有特殊的需要,你可以自己编写解码器,但是通常,没有什么必要。 2.2png Png也是以数据流的方式传输的,与gif相似,png也把数据流分解成若干数据块。在png数据流的开始是png 图像格式的签名。后面的数据块的顺序除了因为依赖性的原因之外,出现的顺序是无关紧要的。在每一Png图象文件流的开始是Png的文件签名,然后是IHDR数据块,后面是其他的一些数据块,Png文件的最后是IEND-文件结束数据块。 每一Png数据块的结构如下:
需要注意的是数据块类型字段,这个字段是由4个ASCII字符组成,每个ACSII字符的大写方式和小写方式具有不同的含义。Png解码器需要根据没个字符的大小写方式选择不同的处理方式。第一个字符的大写方式表示此数据块为一重要数据块,如果解码器不能识别这个类型,则解码失败。反之,小写的则为非重要数据块,解码器可以选择忽略这个数据块。第二个字符的大小写则反映出此数据块是否为png 图像的公有数据块,第三个为保留标志,此字符始终为大写字符,第四个字符的大小写则表示此数据是否可以任意拷贝。 以下是主要的 png 图像数据块类型: 重要数据块:
2.3Jpeg 于前面的两种图象的描述方式不同,Jpeg使用的颜色空间是YCrCb空间,同Mpeg使用的YUV12颜色空间相似。由于人的眼睛对于亮度远比对色度敏感,所以使用YCrCb颜色空间可以在不影响视觉效果的情况下,适当的进行压缩。 YCrCb到RGB的转换矩阵是 | Y | |0.299 0.5870.114|| R | | 0 | | Cb|=|- 0.1687- 0.3313 0.5| *| G | + |128| | Cr| |0.5 - 0.4187- 0.0813|| B | |128|用YCrCb 颜色空间表示的图象的数据经过离散余旋变换(DCT)重新排列后等一系列的变换,用haffuman 来表示。 Jpeg图象的格式也是以每一数据段来描述的,在Jpeg文件的开始,是SOF数据标志,文件最后以EOF标志结束。每一数据段都以0xff表示开始,最后以非零值或者0xff结束。数据段最后的结束标志的不同表示了数据段的意义。主要有一下几种:
在本文的第二部分,我们将介绍在 Linux 上处理以上三种图象的三个函数库,libgif、libpng 和 libjpeg. 参考资料
关于作者 |