㈠ 關於png文件的編輯疑問(質量問題)
1。PNG是LZ77無損壓縮派生的一種點陣圖格式。
2。編輯多次看你做的是什麼樣的編輯,有的時候是會改變的。
3。多次編輯轉換,原圖肉眼看不見或者不察覺,但是是有改變的。
4。壓縮原理很復雜。我告訴你,你願意看嗎?
1.1 索引圖與 RGB 圖 對於 PNG 圖像,可以分為索引(Index)圖和 RGB 圖兩種,索引圖只包含固定數量的顏 色,而 RGB 圖的顏色數量是不受限制的. RGB 圖的每一個象素都保存一個 RGB 值,代表這個象素的顏色,因此,一張 RGB 圖有多 少個象素,文件中就保存多少個 RGB 值. 而索引圖會將其固定數量的顏色,按照順序排列起來,作為顏色的索引保存在文件頭中,被 稱為調色板(palette).每一個象素只保存其顏色在調色板中的索引. 如一個 32 色的索引圖,在文件頭中保存了 32 個顏色,索引值從 0 到 31.圖中每一個象 素只記錄其顏色的索引. 因此,對於一般的 PNG 圖,索引圖文件的大小總是小於 RGB 圖的.
1.2 行程壓縮原理 當我們把一張索引圖的所有象素(N 個) ,按照從上到下,從左至右,即按行掃描的順序排 列起來的時候,我們得到一個隊列.如果我們用 1 個位元組來存儲一個象素 的索引值(調色板顏色不超過 256) ,那麼數據的大小為 N 位元組.這段數據的格式我們表示 為 [I1][I2]…[In] 共 N 個. 在上面的隊列中,可能會出現很多連續相同的索引值,最多的就是透明色.如果我們在每個 索引值前用 1 個位元組保存這個值連續出現的數量(最多可以表示 256 個 ) ,那數據的格式變為 [C1][I1][C2][I2]…[Cm][Im] 共 M 個.那麼一張 256 個象素的 單色圖的所有數據,只需要 2 個位元組來保存.通常,我們所需的圖中總 是有大片連續的顏色,包括透明色,因此按照這個格式保存的圖像,其文件大小可以大大降 低,這就是行程的壓縮原理.
1.3 USI 壓縮原理 如果一張索引圖的顏色數為 32,那麼在[C1][I1][C2][I2]…[Cm][Im] 格式中,I 的數值 都小於 32,那麼每個位元組前 3 bits 始終為 0.為了充分利用這 3 bits,我們可以將 C 的值保存在這 3bits 中,這樣我們的格式變為 [G1][G2]….[Gk] 共 K 個(G 的高位為數量,低位為顏色索引) .這樣,對於 32 色的圖, 每個位元組最多可以保存 8 個象素的信息, 對於 64 色的圖, 每個位元組最多可以保存 4 個象素 的信息,對於 16 色的圖,每個位元組最多可以保存 16 個象素的信息. 在 [G1][G2]….[Gk] 這 K 個位元組前,再加上調色板數據和其它本圖的必要信息,就得到 了 USI 格式的文件.
conan(29842977) 15:03:01 1.1 載入文件
private void load(String file) {
try {
DataInputStream din = new
DataInputStream(getClass().getResourceAsStream(file));
m_flags = din.readInt();
//格式標志
/** 讀取調色板信息 */
m_count = din.readByte() & 0xff; //調色板位數
m_mask = 0xff >> (8 - m_count); //計算 取色板索引的掩碼
int pal_count = din.readByte() & 0xff; //調色板數量
int pal_len = din.readByte() & 0xff; //調色板長度 即顏色數
m_pal = new int[pal_count][pal_len]; //初始化調色板容器
int pal; //讀取調色板信息
for (int i = 0; i < pal_count; i++) { for (int j = 0; j < pal_len; j++) { pal = din.readShort() & 0xffff; m_pal[i][j] = ( ( ( ( (pal & 0xF000) >>> 12) * (17 << 24)) & 0xFF000000) | ( ( ( (pal & 0x0F00) >>> 8) * (17 << 16)) & 0x00FF0000) | ( ( ( (pal & 0x00F0) >>> 4) * (17 << 8)) & 0x0000FF00) | ( ( ( (pal & 0x000F) * 17))) ); } } /** 讀取圖塊信息 */ m_modelCount = din.readShort() & 0xffff; //圖塊數量 //讀取圖塊尺寸 if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { //基於尺寸的轉換方式 m_rebuildWidth = din.readByte() & 0xff; m_rebuildHeight = din.readByte() & 0xff; } else if ( (m_flags & FLAG_REBUILD_MODULE) != 0) { //基於動畫 model 的轉換方式 m_models = new byte[m_modelCount * 2]; din.read(m_models); } /** 讀取像素數據 */ m_dataSize = din.readInt(); //像素數據大小(壓縮數據) m_data = new byte[m_dataSize]; din.read(m_data); //讀取像素數據(壓縮數據) //讀取每個圖塊數據的起始偏移量 int offset = 0; m_dataOffset = new int[m_modelCount]; for (int i = 0; i < m_modelCount; i++) { m_dataOffset[i] = offset; if ( (m_flags & FLAG_16BIT_4_LEN) != 0) { offset += din.readShort(); } else { offset += din.readByte() & 0xff; } } } catch (Exception ex) {} } 1.2 解壓縮 /****************************************** * 解壓縮指定圖塊像素數據 * @param model_id int 圖塊號 * @param pal_id int 調色板號 * @return int[] 解壓縮圖塊像素數據(ARPG 值) ******************************************/ private int[] BuildRle8bFrm(int model_id, int pal_id) { //計算解壓後,像素數據的大小(圖塊 W*圖塊 H) int size; if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { size = m_rebuildWidth * m_rebuildHeight; } else { size = (m_models[model_id * 2] & 0xff) * (m_models[model_id * 2 + 1] & 0xff); } //初始化像素 buf int[] m_bufB = new int[size]; int pal[] = m_pal[pal_id]; //獲取當前調色板 int offset = m_dataOffset[model_id]; //獲取壓縮數據起點 //解壓縮 int count, index, pos = 0; while (pos < size) { count = ( (m_data[offset] & 0xFF) >> m_count) + 1; index = pal[m_data[offset] & m_mask]; offset++; while (--count >= 0) { m_bufB[pos++] = index; } } return m_bufB; } /********************************** * 獲取指定圖塊 Image * @param model_id int 圖塊號 * @param pal_id int 調色板號 * @return Image 圖塊 Image 對象 **********************************/ public Image GetImage(int model_id, int pal_id) { //獲得指定圖塊解壓數據(ARPG 顏色數據) int[] m_bufB = BuildRle8bFrm(model_id, pal_id); //計算圖塊尺寸 int w, h; if ( (m_flags & FLAG_REBUILD_SIZE) != 0) { w = m_rebuildWidth; h = m_rebuildHeight; } else { w = m_models[model_id * 2] & 0xff; h = m_models[model_id * 2 + 1] & 0xff; } //生成 Image 圖片 Image m_image = Image.createRGBImage(m_bufB, w, h, true); m_bufB = null; return m_image; }
㈡ 壓縮文件壓縮的文件的哪部分內容壓縮軟體的原理是什麼
老大,壓縮原理是非常復雜的, 不同的文件有不同的壓縮演算法 壓縮文件的基本原理是查找文件內的重復位元組,並建立一個相同位元組的"詞典"文件,並用一個代碼表示,比如在文件里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示並寫入"詞典"文件,這樣就可以達到縮小文件的目的. 由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等。 有兩種形式的重復存在於計算機數據中,zip就是對這兩種重復進行了壓縮。 一種是短語形式的重復,即三個位元組以上的重復,對於這種重復,zip用兩個數字:1.重復位置距當前壓縮位置的距離;2.重復的長度,來表示這個重復,假設這兩個數字各佔一個位元組,於是數據便得到了壓縮,這很容易理解。 一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重復的概率似乎極低,實則不然,各種類型的數據都有出現重復的傾向,一篇論文中,為數不多的術語傾向於重復出現;一篇小說,人名和地名會重復出現;一張上下漸變的背景圖片,水平方向上的像素會重復出現;程序的源文件中,語法關鍵字會重復出現(我們寫程序時,多少次前後、paste?),以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重復。經過上面提到的方式進行壓縮後,短語式重復的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。 第二種重復為單位元組的重復,一個位元組只有256種可能的取值,所以這種重復是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本文件中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用概率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心演算法就是 zip 演算法,它和 zip 格式的文件的主要區別在於:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重復傾向於出現在離當前壓縮位置較近的地方,重復長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,文件的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大
㈢ 壓縮文件的壓縮原理
把文件的二進制代碼壓縮,把相鄰的0,1代碼減少,比如有000000,可以把它變成6個0 的寫法60,來減少該文件的空間。
由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等。
有兩種形式的重復存在於計算機數據中,zip就是對這兩種重復進行了壓縮。
一種是短語形式的重復,即三個位元組以上的重復,對於這種重復,zip用兩個數字:1.重復位置距當前壓縮位置的距離;2.重復的長度,來表示這個重復,假設這兩個數字各佔一個位元組,於是數據便得到了壓縮,這很容易理解。
一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重復的概率似乎極低,實則不然,各種類型的數據都有出現重復的傾向,一篇論文中,為數不多的術語傾向於重復出現;一篇小說,人名和地名會重復出現;一張上下漸變的背景圖片,水平方向上的像素會重復出現;程序的源文件中,語法關鍵字會重復出現(我們寫程序時,多少次前後、paste?),以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重復。經過上面提到的方式進行壓縮後,短語式重復的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。
第二種重復為單位元組的重復,一個位元組只有256種可能的取值,所以這種重復是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本文件中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用概率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心演算法就是 zip 演算法,它和 zip 格式的文件的主要區別在於:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重復傾向於出現在離當前壓縮位置較近的地方,重復長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,文件的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大。
㈣ PNG圖片是無損壓縮的嗎為什麼還有大小分別
PNG圖片是有壓縮的。
PNG圖片主要有三個類型,分別為 PNG 8/ PNG 24 / PNG 32。
PNG8:PNG 8中的8,其實指的是8bits(一個位元組),相當於用2^8(2的8次方)大小來存儲一張圖片的顏色種類,2^8等於256,也就是說PNG 8能存儲256種顏色,一張圖片如果顏色種類很少,將它設置成PNG 8得圖片類型是非常適合的。
PNG24:PNG 24中的24,相當於3乘以8 等於 24,就是用三個8bits分別去表示 R(紅)、G(綠)、B(藍)。
R(0~255),G(0~255),B(0~255),可以表達256乘以256乘以256=16777216種顏色的圖片,這樣PNG 24就能比PNG 8表示色彩更豐富的圖片。但是所佔用的空間相對就更大了。
PNG32:PNG 32中的32,相當於PNG 24 加上 8bits的透明顏色通道,就相當於R(紅)、G(綠)、B(藍)、A(透明)。
R(0~255),G(0~255),B(0~255),A(0~255)。比PNG 24多了一個A(透明),也就是說PNG 32能表示跟PNG 24一樣多的色彩,並且還支持256種透明的顏色,能表示更加豐富的圖片顏色類型。
(4)png壓縮原理擴展閱讀
PNG圖片的壓縮,分兩個階段:
預解析(Prediction):這個階段就是對png圖片進行一個預處理,處理後讓它更方便後續的壓縮。比如就是一個女神,在化妝前,會先打底,先塗乳液和精華,方便後續上妝、美白、眼影、打光等等。
壓縮(Compression):執行Deflate壓縮,該演算法結合了 LZ77 演算法和 Huffman 演算法對圖片進行編碼。
壓縮階段會將預處理階段得到的結果進行Deflate壓縮,它由 Huffman 編碼 和 LZ77壓縮構成。
如前面所說,Deflate壓縮會標記圖片所有的重復數據,並記錄數據特徵和結構,會得到一個壓縮比最大的png圖片 編碼數據。
Deflate是一種壓縮數據流的演算法. 任何需要流式壓縮的地方都可以用。
還有就是我們前面說過,一個png圖片,是由很多的數據塊構成的,但是數據塊裡面的一些信息其實是沒有用的,比如用Photoshop保存了一張png圖片。
圖片里就會有一個區塊記錄「這張圖片是由photshop創建的」,很多類似這些信息都是無用的,如果用photoshop的「導出web格式」就能去掉這些無用信息。
㈤ 圖片格式(BMP,JPEG,GIF,PSD,PNG,TIFF,TGA,EPS)的基本原理
各種圖像格式
這里介紹的是製版印刷中有代表性的格式。它們各自都存在優缺點,說不上哪個是優,哪個是劣。有的正在ISO審議中。
TIFF
系Tagged Image File Format之縮略。意為標記圖像文件格式,系由許多應用軟體配套的有代表性的格式。數據本身、色、大小等的屬性由稱做標記的數據說明部分描述的文件構成。根據這個標識,確定各種屬性或數據形式。藉助標記提高了文件的隨意性,在不同的應用軟體之間和不同的計算機之間,數據的互換也方便。
TIFF/IT
系TIFF for Image Technology之縮略。
系用TIFF結構來表現印刷用的圖像數據的標准。主要是針對CMYK等的分色圖像確定TIFF文件形式,不依賴於OS,而適用於印刷製版中所用的光柵數據文件的交換格式。有連續調色彩(CS)、線條版(LW)、高分辨力連續調(HC)、單色層次(MP)、點子組合2值(BP)、連續數據(run-length)2值(BL)等各種圖像數據。其擴充方案也正在ISO探討中。
TIFF/IT-P 1
針對TIFF/IT的各圖像數據形式,指定叫做profile 1的格式。對於CT、LW、HC、MP、BP、BL各圖像數據形式,可以使用標記信息組及其值受到限制的標准。
EPSF,EPS
系Encapsulated PostScript Format之縮略。由美國Adobe Systems公司開發,系將PostScript數據於軟體之間進行接受的格式。多數情況用EPS表示。為了確認數據的配置和內容,添付專用的標題文本的同時,使用包括表示畫面專用的圖畫格式。
因為EPS是對應PostScript的緣故,在各種DTP軟體上處理圖像數據時,成為事實上的標准格式。已經採用了供印刷而用的DCS(Desktop Color Separator)形式。由於採納了DCS,彩色圖像是分為CMYK各色4個文件來保存。作為其它的特長,可以只切取圖像予以利用,還有可以做到JPEG壓縮等。文字和照片等的圖像,用圖像照相機(imagesetter)等的輸出機輸出時,多數場合是對應PostScript的關系,可用EPS來保存數據。
PICT
系Picture之縮略。由美國蘋果計算機公司確定的圖像格式。在macOS上工作的幾乎所有的應用軟體給予了幫助。亦稱作Macintosh特有的格式。
JPEG
系Joint Photographic Image Experts Group之縮略。
系ISO 和ITU(電通信協會)確定的彩色靜止畫縮放編碼方式的標准,是在製版印刷領域最普遍使用的壓縮格式。壓縮率自1/5到1/30的程度。由於是非可逆壓縮的關系,在減壓縮時,會損失一部分信息。當需要高壓縮率和高品質再現的場合,就需要特定的壓縮技術。
PDF
系Portable Document Format之縮略,意為可移植文件格式。由美國Adobe Systems公司以PostScript技術為基礎提倡的文件格式。縮放都能做到,而且文字和圖形的輪廓完美無缺,效果極好。不依靠計算機的工作平台也能處理。又因為可以填裝字體,被稱作是本世紀的標准格式。
通常,用於辦公業務。供印刷用時,已有特殊化後的PDF,叫PDF/X正由ISO研討中。
㈥ 想要將圖片文件壓縮為png格式,怎麼做到的
問題:圖片文件怎樣壓縮才能壓縮成png格式
這里有一個好的方法教大家怎樣壓縮圖片文件,推片文件時可以批量壓縮的,我們通常壓縮文件都會將文件壓縮成為壓縮包,但是圖片文件可以直接壓縮,我們來看看圖片文件時怎樣壓縮成為png格式的吧,首先我們需要工具打開在合格工具上。
1、點擊打開工具選擇圖片壓縮這個功能進到頁面。
是不是很簡單呢,而且這樣壓縮圖片文件時不會對圖片文件的畫質形成什麼影響的,我們可以對視頻文件進行保存到新的文件夾下,也可以將文件保存在原文件夾下,工具會減小圖片文件的大小但是不會影響圖片文件的使用。
㈦ png圖片的作用原理是什麼
這個問題我可以回答你,PNG是帶阿爾法通道的一種圖片格式,也就是說它可以生成透明的背景,還有一種和PNG類似的格式叫TGA,TGA是一種大體上和PNG一樣,但帶有序列的一種格式,如果你學習網頁的話你應該知道,PNG格式的內存很小,而且可以輸出透明背景,所以廣泛用於網站上,專業的製作PNG的軟體是網頁三劍客之一的Fireworks,它是專業的製作PNG圖片的軟體,是著名的adobe公司生產的!希望我的答案您會滿意
㈧ 壓縮或解壓文件是什麼原理
壓縮文件的基本原理是查找文件內的重復位元組,並建立一個相同位元組的"詞典"文件,並用一個代碼表示,比如在文件里有幾處有一個相同的詞"中華人民共和國"用一個代碼表示並寫入"詞典"文件,這樣就可以達到縮小文件的目的.
由於計算機處理的信息是以二進制數的形式表示的,因此壓縮軟體就是把二進制信息中相同的字元串以特殊字元標記來達到壓縮的目的。為了有助於理解文件壓縮,請您在腦海里想像一幅藍天白雲的圖片。對於成千上萬單調重復的藍色像點而言,與其一個一個定義「藍、藍、藍……」長長的一串顏色,還不如告訴電腦:「從這個位置開始存儲1117個藍色像點」來得簡潔,而且還能大大節約存儲空間。這是一個非常簡單的圖像壓縮的例子。其實,所有的計算機文件歸根結底都是以「1」和「0」的形式存儲的,和藍色像點一樣,只要通過合理的數學計算公式,文件的體積都能夠被大大壓縮以達到「數據無損稠密」的效果。總的來說,壓縮可以分為有損和無損壓縮兩種。如果丟失個別的數據不會造成太大的影響,這時忽略它們是個好主意,這就是有損壓縮。有損壓縮廣泛應用於動畫、聲音和圖像文件中,典型的代表就是影碟文件格式mpeg、音樂文件格式mp3和圖像文件格式jpg。但是更多情況下壓縮數據必須准確無誤,人們便設計出了無損壓縮格式,比如常見的zip、rar等。壓縮軟體(compression software)自然就是利用壓縮原理壓縮數據的工具,壓縮後所生成的文件稱為壓縮包(archive),體積只有原來的幾分之一甚至更小。當然,壓縮包已經是另一種文件格式了,如果你想使用其中的數據,首先得用壓縮軟體把數據還原,這個過程稱作解壓縮。常見的壓縮軟體有winzip、winrar等。
有兩種形式的重復存在於計算機數據中,zip就是對這兩種重復進行了壓縮。
一種是短語形式的重復,即三個位元組以上的重復,對於這種重復,zip用兩個數字:1.重復位置距當前壓縮位置的距離;2.重復的長度,來表示這個重復,假設這兩個數字各佔一個位元組,於是數據便得到了壓縮,這很容易理解。
一個位元組有 0 - 255 共 256 種可能的取值,三個位元組有 256 * 256 * 256 共一千六百多萬種可能的情況,更長的短語取值的可能情況以指數方式增長,出現重復的概率似乎極低,實則不然,各種類型的數據都有出現重復的傾向,一篇論文中,為數不多的術語傾向於重復出現;一篇小說,人名和地名會重復出現;一張上下漸變的背景圖片,水平方向上的像素會重復出現;程序的源文件中,語法關鍵字會重復出現(我們寫程序時,多少次前後、paste?),以幾十 K 為單位的非壓縮格式的數據中,傾向於大量出現短語式的重復。經過上面提到的方式進行壓縮後,短語式重復的傾向被完全破壞,所以在壓縮的結果上進行第二次短語式壓縮一般是沒有效果的。
第二種重復為單位元組的重復,一個位元組只有256種可能的取值,所以這種重復是必然的。其中,某些位元組出現次數可能較多,另一些則較少,在統計上有分布不均勻的傾向,這是容易理解的,比如一個 ASCII 文本文件中,某些符號可能很少用到,而字母和數字則使用較多,各字母的使用頻率也是不一樣的,據說字母 e 的使用概率最高;許多圖片呈現深色調或淺色調,深色(或淺色)的像素使用較多(這里順便提一下:png 圖片格式是一種無損壓縮,其核心演算法就是 zip 演算法,它和 zip 格式的文件的主要區別在於:作為一種圖片格式,它在文件頭處存放了圖片的大小、使用的顏色數等信息);上面提到的短語式壓縮的結果也有這種傾向:重復傾向於出現在離當前壓縮位置較近的地方,重復長度傾向於比較短(20位元組以內)。這樣,就有了壓縮的可能:給 256 種位元組取值重新編碼,使出現較多的位元組使用較短的編碼,出現較少的位元組使用較長的編碼,這樣一來,變短的位元組相對於變長的位元組更多,文件的總長度就會減少,並且,位元組使用比例越不均勻,壓縮比例就越大。