本博文爲概覽性介紹。後面有空了再分幾篇博文分別介紹所用到的技術細節。算法
1.編解碼目標編碼
編碼和解碼是個逆過程。jpeg編碼的目的在於圖形去冗餘,進行數據壓縮,解碼的目的在於還原圖像,使可以進行預覽。spa
2.編碼過程code
貼一張網上的圖片,但缺乏了一些步驟,下面用文字來描述每個步驟。component
2.1.採樣。blog
8位採樣,像素值的範圍鎖定在0-255,無符號,都爲正數。圖片
2.2.分塊(block)io
補成8x8的block,以應對寬和高不是8的整數倍的狀況,方便後續進行8x8的DCT2變換。ast
2.3.零偏置(LevelOffset)im
經過減28-1=128,使各個像素值以0爲中心分佈,變換後的值有的爲正,有的爲負,在[-128,127]區間分佈。
2.4.8x8的二維離散餘弦變換(DCT2)。
DCT變換是最小均方偏差條件下的得出的最佳正交變換。能夠去相關性,將時域數據變換到頻域,將能量集中於低頻份量附近。
變換後能夠看到:變換前的8x8個數據值,大小都很接近;變換後,能量集中於左上角,右下角的較小。左上角——直流份量值的絕對值通常變成了最大的值。
2.5.z字形編碼(zigzag scan)。
由2維變1維,通常後掃描到的值的絕對值小於先掃描的。
2.6.量化(quantization)。
將較大的值按必定的倍數進行縮小,而這個縮小倍數視位置不一樣而不一樣。(補充:該步驟能夠與上一步顛倒)(若是先量化再掃描,能夠看到:在量化後,後下角的值大部分都變成接近0的較小的值)
2.7.差分脈衝編碼(DPCM)對直流係數(DC)進行編碼。
相同component份量的每一個block的直流份量值,設置爲一個差值,爲:cur_block_dc_val - last_block_dc_val,DPCM也由此而來,即DC值的差分。
2.8.行程編碼(RLE)對交流係數(AC)進行編碼。
8x8的數據塊,除了第一個DC值外,其餘63個都是交流值,須要用到RLE編碼。
RLE也稱爲遊程編碼,由一對值來表示,例如(m,n),m表示距離下一個非零值的距離,n表示下個值的值大小。例如(0,12)表示緊接着的值是12,而(4,6)表示中間通過4個0後,下個值爲6。
2.9.熵編碼(entropy encode)。
通常使用範式霍夫曼編碼(huffman_encode——可變長編碼算法中的一種),高几率的字符分配較短的code來表示,低機率的字符分配較長的code來表示。
3.其餘補充說明
採樣和量化都是有損編碼,而DCT變換、DPCM、RLE、HuffmanEncode爲無損編碼。