32bitTGA的rle压缩以及解压算法(一)

 

该算法以32bitTGA的特点来设计的,32bitTGA有大量的透明区域,我们可以将透明区域压缩,以及将象素连续重复的图块压缩,也就是说,压缩主要是针对两个方面的,

1。图片有大量的透明区域

2。图片有连续的象素相同的区域

综上所述,该算法对没有Alpha蒙板的图片以及比较复杂的图片压缩效果很差

流程如下:

原始数据: 

DWORD relRad[20] =
 {
  0x43fe7693,
  0xfe784981,
  0x02873145,
  0x98ff9821,
  0xff678653,
  0xff678653,
  0xff678653,
  0xff678653,
  0xff678653,
  0xff678653,
  0x00423546,
  0x00fe3214,
  0x00543245,
  0x6412389f,
  0x98423481,
  0xfe654624,
  0x00f31231,
  0x00543123,
  0xfe312313,
  0xfe312313,
 };

压缩流程

while(还有数据)

{

     if(连续alpha为0)

     {

             while(连续alpha为0)

            {

                         //压缩数据

            }

     }

     else if(连续象素相等)

      {

                while(连续象素相等)

                  {

                            // 压缩数据

                  }

       }

       else

       {

                    //无压缩的数据

        }

}

 

最后的压缩数据有压缩数据快表示,每个数据块由两部分组成

1。数据头, 一个DWORD。

2。数据体

数据头的意义如下

0x 0 0 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X

前两位为标志位,后面为数据块的长度

对三个类型的数据块意义分别如下:

1。连续alpha为0的数据. 0x11XXXXXXXXXXXXXXXXXXXX. 后30位为重复的次数(此时,数据体长度为1)

2。连续象素想等的数据. 0x10XXXXXXXXXXXXXXXXXXXX. 后30位为重复的次数(此时,数据体长度为1)

3。无压缩数据. 0x00XXXXXXXXXXXXXXXXXXXX. 后30位为无压缩的数据长度(此时,数据体长度为后30位表示的值)

如上边的那些数据

4--  43fe7693  fe784981  2873145  98ff9821 

10000006--  ff678653 

11000003--  0 

3--  6412389f  98423481  fe654624 

11000002--  0 

10000002--  fe312313 

你可能感兴趣的:(程序涂鸦)