BMP、GIF和JPEG文件格式简介及相互转换

时间:2021-12-21 10:03:31
BMP、GIF和JPEG文件格式简介及相互转换 作者:江平 发布时间:2000/11/27
 
文章摘要:
  本文主要讨论的是位图的压缩方法。
BMP、GIF和JPEG文件格式简介及相互转换        

正文: BMP、GIF和JPEG文件格式简介及相互转换  

BMP、GIF和JPEG文件格式简介及相互转换  


  图象文件就是描绘了一幅图象的计算机磁盘文件。形成数字图象数据后,将其存储在计算机里的方法有2种,即位映射和向量处理方式。
  我们这里主要讨论的是位图。不同图象软件几乎都用各种的方法处理图象,图象格式也多种多样,它主要包括文件识别头和图象数据。文件识别头用来让计算机判断是哪种文件格式,图象数据包含了整个对图象描绘相关数据,包括调色板、位图映象等。根据压缩算法不同,映象方式也不同,下面简要介绍一下压缩算法。

一、 行程长度压缩
  原理是将一扫描行中的颜色值相同的相邻像素用一个计数值和那些像素的颜色值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。对于拥有大面积,相同颜色区域的图像,用RLE压缩方法非常有效。由RLE原理派生出许多具体行程压缩方法:
  1.PCX行程压缩方法: 该算法实际上是位映射格式到压缩格式的转换算法,该算法对于连续出现1次的字节Ch,若Ch>0xc0则压缩时在该字节前加上0xc1,否则直接输出Ch,对于连续出现N 次的字节Ch,则压缩成0xc0+N,Ch这两个字节,因而N最大只能为ff-c0=3fh(十进制为63),当N大于63时, 则需分多次压缩。
  2.BI_RLE8压缩方法:在WINDOWS的位图文件中采用了这种压缩方法。该压缩方法编码也是以两个字节为基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数。 如编码 0504表示从当前位置开始连续显示5个颜色值为04的像素。当第二个字节为零时第二个字节有特殊含义:0表示行末;1表示图末;2转义后面2个字节, 这两个字节分别表示下一像素相对于当前位置的水平位移和垂直位移。这种压缩方法所能压缩的图像像素位数最大为8位(256色)图像。
  3.BI_RLE压缩方法: 该方法也用于WINDOWS位图文件中,它与 BI_RLE8编码类似,唯一不同是:BI_RLE4的一个字节包含了两个像素的颜色,因此,它只能压缩的颜色数不超过16的图像。因而这种压缩应用范围有限。
  4.紧缩位压缩方法(Packbits):该方法是用于Apple公司的Macintosh机上的位图数据压缩 方法, TIFF 规范中使用了这种方法, 这种压缩方法与BI_RLE8压缩方法相似,如1c1c1c2132325648 压缩为:83 1c 21 81 32 56 48,显而易见, 这种压缩方法最好情况是每连续128个字节相同,这128个字节可压缩为一个数值7f。这种方法还是非常有效的。

二、霍夫曼编码压缩:
  也是一种常用的压缩方法。是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后为010011011011100。产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。

三、LZW压缩方法
  LZW压缩技术比其它大多数压缩技术都复杂, 压缩效率也较高。其基本原理是把每一个第一次出现的字符串用一个数值来编码,在还原程序中再将这个数值还成原来的字符 串,如用数值0x100代替字符串"abccddeee"这样每当出现该字符串时,都用0x100代替,起到了压缩的作用。 至于0x100与字符串的对应关系则是在压缩过程中动态生成的,而且这种对应关系是隐含在压缩数据中,随着解压缩的进行这张编码表会从压缩数据中逐步得到恢复,后面的压缩数据再根据前面数据产生的对应关系产生更多的对应关系。直到压缩文件结束为止。LZW是可逆的, 所有信息全部保留。

四、算术压缩方法
  算术压缩与霍夫曼编码压缩方法类似,只不过它比霍夫曼编码更加有效。算术压缩适合于由相同的重复序列组成的文件,算术压缩接近压缩的理论极限。这种方法,是将不同的序列映像到0到1之间的区域内,该区域表示成可变精度(位数 )的二进制小数,越不常见的数据要的精度越高(更多的位数),这种方法比较复杂,因而不太常用。

五、 JPEG( 联合摄影专家组 Joint Photographic Exprerts Group)
  JPEG标准与其它的标准不同,它定义了不兼容的编码方法,在它最常用的模式中,它是带失真的,一个从JPEG文件恢复出来的图像与原始图像总是不同的,但有损压缩重建后的图像常常比原始图像的效果更好。JPEG的另一个显著的特点是它的压缩比例相当高,原图像大小与压缩后的图像大小相比,比例可以从1%到80~90%不等。 这种方法效 果也好,适合多媒体系统。

  介绍完了压缩算法,我们来简要介绍一下三种位图格式的异同和它们之间的相互转换。
  1. bmp图象
   · 位图文件头(BITMAPHEADER)数据结构
   · 位图信息(BITMAPINFO)数据结构
   · 位图阵列

  1)位图文件头数据结构包含BMP图象文件的类型、显示内容等信息。
  Typedef struct{
      Int bfType; //must be "BM"
      Long bfSize; //位图大小
      Int bfReserved1;//must be "0"
      Int bfReserved2;//must be "0"
      Long bfOffBits;//位图阵列的起始位置
  }BITMAPEFILEHEADER;

  2)位图信息数据结构由BITMAPINFOHEADER和RGBQUAD两个数据结构组成,
  typedef struct{
      BITMAPINFOHEADER bmiHeader;
      RGBQUAD bmiColors[];
  }BITMAPINFO

  其中BITMAPINFOHEADER数据结构包含了有关BMP图象的宽、高、压缩方法等信息。
  数据结构RGBQUAD定义一种颜色。

  3)位图阵列
  位图阵列记录了图象的每一个象素值。从图象的左下角开始逐行扫描图象。从左到右,从上到下,将图象的象素值逐一记录下来,这些记录象素值的字节组成了位图阵列。
  位图阵列数据的存储格式有压缩和非压缩两种格式。
  1. 非压缩格式 位图中的每一个点的象素值对应与位图阵列的若干位,而位图阵列的若干位由图象的高度、宽度及图象的颜色数决定。
  2. 压缩格式 在bmp格式文件中,Windows支持BI-RLE8和BI-RLE4两种压缩类型的存储格式。

  2、GIF图象文件格式
  GIF的全称是Graphics Interchange Format,.译做图形交换格式。GIF是一种公用的图象文件格式标准,但它归compuServe公司版权所有。
GIF文件结构包含一个文件头,
            

  在一个GIF文件中首先碰到的是GIF的标志,这个标志告诉解码程序这是个GIF文件。这个标志是3字节的串:GIF。一个GIF文件中可以存放多幅图象,但绝大多数的文件都只包含一幅图象。
  然后是屏幕描述字(screen descriptor),说明了用来生成的显示文件中的图象的显示器分辨率,分别表示屏幕的宽和高。
  紧跟下来的一个字节是全局标志,其低三位说明了即将碰到的图象是多少颜色的。最高位表示是否存在一个全局色彩表。
  背景色表示把背景置成适当的颜色,实际上是一个指向全局色彩表的数。
  Struct Global_Data{
    Unsigned short screen_width;
    Unsigned short screen_height;
    Unsigned char background;
    har tail='/0';
    }
  接下来是全局色彩表,按顺序存放所有的严肃,每一种严肃由色彩表的一项来描述,每项是3字节,分别表示红、绿、蓝三种原色的强度。其长度有全局标志的低三位表示。
  以后的数据都是局部的了。是些数据块的集合。下面是图象数据块的结构。
  Struct Local_Head{
      Char heading=',';
      Unsigned short image_left;//图象的屏幕上显示的起始位置
    Unsigned short image_top;
    Unsigned short image_width;
    Unsigned short image-height;
    Unsigned char local_flag;//局部标志
    }

  局部标志和 全局标志的不同之处在于次高位,如果这位被置成1则表示图像的位图数据是以隔行方式存放的。也就是说,在解开的位图数据中,第一行存放的是屏幕上第一行,第二行对应屏幕上的第9行,第三行对应屏幕上的第17行,以此递增--这是第一遍扫描;第二遍扫描是从屏幕上的第5行开始,两行之间也是以8递增;第三遍扫描是从屏幕上的第3行开始,两行之间以4递增;第四遍扫描,也是最后一遍,从第2行开始,两行之间以2递增。隔行存放的图像数据和顺序(不隔行)存放的图像数据的对应关系如下图所示:
  

  隔行存放的GIF图像在边解码边显示的时候可分成四遍扫描。第一遍扫描虽然只显示了整个图像的八分之一,第二遍的扫描后也只显示了四分之一,但这已经把整个图像的概貌显示出来了。在显示GIF图像的时,隔行存放的图像会给你这样一个印象:向它的显示速度似乎要比其他图像快一些,这是隔行存放的优点。
  在GIF图像的编解码中用到了LZW压缩算法--把这些字符流转换成另一种形式的代码流,解码过程则是把这种代码流还原成原来的字符流。

  3、JPEG图象文件格式
  JPEG是Joint Photographic Experts Group(联合摄影专家小组)的首字母缩写。JPEG的主要作用是用于数字化图象的标准编码技术。JPEG图象文件是一种象素格式文件格式,但它比诸如象GIF、BMP等图象文件要复杂的多。所幸,我们在使用由JPEG组成的JPEG库时,只要对该文件格式有个一般的了解就可以了。而没有必要对JPEG文件格式做一个全面细致的了解。
  JPEG格式是种有损的编码格式,但如果GIF文件比,他经过解码后的重构图象要比GIF图象更接近于原始的图象。 JPEG编码技术是由颜色转换、DCT变换、进行量化、编码。其压缩格式由著名的JPEG集团所著的4.0版本的库所定。

  关于这3种图象格式的互相转换,主要是用c语言或c++和汇编语言,因为这些语言可以 直接进行底层的操作,把图象解压缩后按用另一种格式要求进行压缩即可。