在這個大數據時代,我們保存的數據量有時候往往是非常龐大的,存儲它將會耗費非常多的內存,讀取速度也相對減慢了。
因此常常需要對數據進行壓縮編碼存儲,等到要用到這個數據的時候再解壓縮就行,這樣不僅可以節約大量的存儲空間,而且節省了系統讀取和反應的時間。
柵格數據壓縮編碼的方法有很多種,包括鏈式編碼、行程編碼、塊式編碼和四叉樹編碼。今天我們就來講一下行程編碼(也叫游程編碼)。
首先從一個簡單的例子開始:編碼一個在 5 * 5 方塊上使用三種顏色繪制的圖像。
圖 1
根據方塊不同的顏色匹配不同的字母。這里使用 Y 代表黃色,使用 G 代表綠色,使用 B 代表藍色。
那么,根據這樣的規則,圖 1 的圖形編碼就變成了 25 個字母,如圖 2 所示。
圖 2
接下來,我們通過使用 游程編碼 的方式來表示這個圖像,以便使用 25 個字符以下的字符來表示。
游程編碼是一種將代碼和重復的次數作為一組來編碼的方法。
例如,我們可以通過將第一個 “YYYY” 的部分表示未 “Y4”,這樣就可以將其 縮短兩個字符 。
按照這種操作,圖 2 的 25 個字符就能縮短為 20 個字符了。
動圖 3
這樣,如果我們知道每行有 5 個方塊,原始圖像就可以從代碼中提取出來了。這種還原的操作也就是我們俗稱的 解壓。
當然,游程編碼也不是萬能的,它也有它的適用性與局限性。
圖 4
觀察圖 4 的圖像與對應的代碼,可以發現:雖然使用 游程編碼 使得總體的字符數減少,但對於那些不具備相同顏色的部分,在進行游程編碼后,字符數反而會增加。
圖 5
特別的,如果對連續性極其差的數據進行游程編碼,字符數不減反增:數據翻倍到 50 個字符了。
當然,對於具有連續性的數據進行游程編碼,那壓縮量就十分可觀了。
圖 6
因此,根據要編碼的數據,游程編碼可能具有壓縮效果,也可能不具有壓縮效果。
所以,對一定數量連續的數據使用游程編碼才是正確的使用時機。
再舉個例子,考慮一下在單色傳單上使用游程編碼。
動圖 7
如動圖 7 所示,使用 W (White)和 B(Black)字母來表示每個方塊。
按照這樣的邏輯,一開始只需要 25 個字符就能表示完畢。
如果使用 游程編碼,那么最終的表達結果是需要 26 個字符表示。所以,在這種情況下,使用 游程編碼 是沒有意義的。
但仔細觀察,在黑白圖像中僅僅使用了黑和白這兩種顏色。因此,在連續的白色方塊之后必定出現的是黑色方塊。那么即使沒有字母 W 和字母 B,依舊可以通過代碼還原恢復圖像。
圖 8
如圖 8 所示,通過省略字母 W 和字母 B,僅僅只需要 13 個字符就能表示圖像,相對於之前的需要 26 個字符表示壓縮了一半的大小。
當然,這樣顯示是有一個要求的,那就是 代碼的第一個數字必須是白色方塊的連續數。只有使用了這個規則,才能通過代碼還原出之前的圖像。
圖 9
所以,對於圖 9 這種開頭是黑色方塊的圖像的代碼,需要在代碼的開頭處添加 0 ,這樣就也遵守了 代碼的第一個數字必須是白色方塊的連續數這條規則。