RLE(Run Length Encoding)行程長度壓縮演算法(也稱遊程長度壓縮演算法),是最早出現、也是 最簡單的無損資料壓縮演算法。RLE演算法的基本思路是把資料按照線性序列分成兩種情況:一種是連續的 重複資料區塊,另一種是連續的不重複資料區塊。對於第一種情況,對連續的重複資料區塊進行壓縮,壓縮 方法就是用一個表示塊數的屬性加上一個資料區塊代表原來連續的若干塊資料。對於第二種情況,RLE算 法有兩種處理方法,一種處理方法是用和第一種情況一樣的方法處理連續的不重複資料區塊,僅僅是表 示塊數的屬性總是1;另一種處理方法是不對資料進行任何處理,直接將未經處理資料作為壓縮後的資料。
為了更直觀的說明RLE演算法,下面就用樣本資料就對RLE演算法進行示範。首先是第一種情況,原 始資料有5個連續相同的資料區塊組成:
[block] [block] [block] [block] [block]
則 壓縮後的資料就是:
[5] [block]
接著是第二種情況,未經處理資料由連續的不重複資料區塊 組成:
[block1] [block2] [block3] [block4] [block5]
按照第一種處理方法,最後 的壓縮資料就如以下情形:
[1][block1] [1][block2] [1][block3] [1][block4] [1] [block5]
如果按照第二種處理方法,最後的資料和未經處理資料一樣:
[block1] [block2] [block3] [block4] [block5]
資料區塊block的長度可以是任意長度,資料區塊長度越長則連續重 複的機率就越低,壓縮的優勢就體現不出來,因此,大多數RLE演算法的實現都使用一個位元組作為資料區塊 長度。
接下來本文就介紹幾種RLE演算法的實現,首先是最簡單的一種演算法實現,這種演算法實現 對連續的不重複位元組採用和重複位元組一樣的處理方法,就是在每個位元組前增加一個值是1的連續塊數屬 性(一個位元組)。採用這種處理方法的首先好處是壓縮和解壓縮演算法簡單,可以用相同的模式處理兩 種情況的壓縮資料,缺點就是當未經處理資料重複率比較低時,壓縮後的資料長度會超過未經處理資料的長度 ,起不到壓縮的作用,最糟糕的情況就是所有資料區塊沒有連續重複的情況,壓縮後的資料反而膨脹一 倍。壓縮的過程是這樣的,線性掃描未經處理資料,如果某一個位元組後面有重複的位元組,則增加重複計數 ,然後繼續向後掃描,直到找到一個不重複的位元組,然後將塊數和這個位元組的資料依次寫入壓縮資料 ,然後從新的開始位元組繼續掃描直到原書資料結束。演算法中需要注意的一點就是塊數屬性是用一個字 節儲存的,因此最大值就是255,當連續的相同資料超過255個位元組時,就從第255個位元組處斷開,將第 256個位元組以及256位元組後面的資料當成新的資料處理。這種RLE壓縮演算法的C語言實現如下:
6 int Rle_Encode_N(unsigned char *inbuf, int inSize, unsigned char *outbuf, int onuBufSize) 7 { 8 unsigned char *src = inbuf; 9 int i; 10 int encSize = 0; 11 12 while(src < (inbuf + inSize)) 13 { 14 if((encSize + 2) > onuBufSize) /*輸出緩衝區空間不夠了*/ 15 { 16 return -1; 17 } 18 unsigned char value = *src++; 19 i = 1; 20 while((*src == value) && (i < 255)) 21 { 22 src++; 23 i++; 24 } 25 outbuf[encSize++] = i; 26 outbuf[encSize++] = value; 27 } 28 29 return encSize; 30 }