Operator Library: Compression
此運算子對 8 位元灰階影像執行 JPEG 壓縮。
![]() |
需要 8x8 像素區塊的輸入資料 |
|---|---|
|
在其輸入端,運算子需要接收已重新對應至 8x8 像素區塊的影像資料。 如果您使用 microEnable IV 擷取卡,則可以使用運算子 ImageBuffer_JPEG_Gray 進行此重新對應。 對於 microEnable IV 設計,只需在運算子 JPEG_Encoder_Gray 前面使用運算子 ImageBuffer_JPEG_Gray。 運算子 ImageBuffer_JPEG_Gray 旨在執行此重新排序。 如果您使用 microEnable 5 擷取卡,請在使用運算子 JPEG_Encoder_Gray 之前,確保將影像資料重新對應至 8x8 像素區塊(使用一般 VisualApplet 選項)。 |
運算子的輸出是不含 JPEG 標頭的 Huffman 資料流。 壓縮率取決於所選的量化表,該量化表在執行階段可變更。 對於 Huffman 編碼,會使用標準明度表。 除了量化表之外,壓縮率(即輸出資料流大小)也取決於輸入影像。 因此,運算子的輸出寬度可變更為所需的輸出大小。
JPEG 編碼器能夠在每個時脈週期處理約 2.5 個輸入像素。 時脈頻率取決於所使用的擷取卡。microEnable IV 擷取卡的基礎時脈頻率為 62.5MHz。 因此,該運算子可以在 microEnable IV 擷取卡上處理 158MPixels/s。 如果使用導致高品質壓縮的量化表,可以降低資料速率。 這適用於大約大於 95% 的 Quality 層級。 請參閱 JPEG 應用說明以了解更多詳細資訊。
該運算子允許使用代表兩種不同配置方式的兩個參數來選擇量化表。
-
如果需要,可以個別設定每個量化表值。 在這種情況下,請使用參數 quantization_matrix。
-
或者,也可以根據百分比值來決定量化表。 在此情況下,請使用參數 quality_in_percent。
標準明度量化表如以下所示,並用作運算子的預設設定。
如果使用百分比 Quality,則透過以下方程式計算量化表
如所述,運算子的輸出是編碼影像資料的 Huffman 資料流。 底層 DC 係數與 AC 係數是固定的,取自文獻: W. P. Pennbaker and J. L. Mitchell, JPEG Still Image Data Compression Standard, Van Nostrand Rheinhold, 1993。 請參閱下文以查看列表。 編碼器產生的 Huffman 資料流不包含產生 JPEG 影像檔所需的 JPEG 標頭。 此外,產生的資料流具有 32Bit width。 JPEG 資料流的最後一個字組(即最後四個位元組)提供具有以下格式的狀態資訊:
-
最後一個字組的第零和第一個位元組代表 JPEG EOI 標記,即 0xff 和 0xd9。
-
第二個位元組代表倒數第二個資料字組中所使用的位元組數,範圍在 [1, 4] 內,即 JPEG 資料流的真實結尾。
-
最後一個位元組(第三個位元組)代表錯誤碼。 如果 JPEG 資料流大於為輸出連結指定的最大影像寬度,則輸出將被截斷。 如果發生這種情況,最後一個位元組將設為 1,這允許偵測此截斷。
以下給出 JPEG 輸出資料流結尾的範例:
倒數第二個字組:0xffff5fed
最後一個字組:0x0002d9ff
因此,JPEG 輸出資料流以倒數第二個字組的第二個位元組結束。 資料流未被截斷。
算子限制
-
此 operator 不支援空圖像,也就是沒有像素的圖像。
-
連接埠 I 處每個輸入影像的行必須具有相同的長度。因此不允許行長度不一致的影像。
| quality_in_percent | |
|---|---|
| Type | 動態讀取/寫入參數 |
| Default | 50 |
| Range | [-1, 100] |
|
使用此參數可以變更 JPEG 壓縮的 Quality。 量化矩陣是使用上面給出的方程式從百分比值確定的。 可以從參數 quantization_matrix 讀取確定的量化值。 該參數是動態的,且應僅在小程式(applet)閒置期間變更。 可以定義介於 0 和 100 之間的 Quality 設定。 寫入此參數會覆寫透過參數 quantization_matrix 對量化矩陣進行的手動變更。 如果從 quality_in_percent 讀取到 -1,則表示已對量化矩陣進行了手動變更。 |
|
| quantization_matrix | |
|---|---|
| Type | static/dynamic read/write parameter |
| Default | 標準矩陣(見上文) |
| Range | [1, 255] |
|
此參數是動態讀寫矩陣參數。 如果 JPEG Quality 是以百分比值設定。 此參數可用於讀取確定的量化矩陣值。 此參數也可用於指定使用者定義的量化矩陣。 這可以透過寫入任何量化矩陣值來完成。 請注意,寫入 qulity_in_percent 參數將會捨棄使用者指定的量化值。 為了方便起見,在寫入使用者指定的值後,參數 quality_in_percent 會被設為 -1。 |
|
以下範例顯示了 JPEG_Encoder_Gray 運算子的使用方式:
-
範例 - 顯示針對 microEnable 4 與 5 平台已過時的 JPEG_Encoder_Gray 運算子用法的簡單範例。
-
「在平行處理中使用多個 JPEG_Encoder_Gray 運算子」
範例 - 在平行處理中使用多個 JPEG_Encoder_Gray 運算子
使用了以下的 Huffman DC 和 AC 係數。
typedef char DCHuffTableType[12][17]; // huffman-table for luminance-DC-coefficients
DCHuffTableType Lum_DC_HuffmanTable= {
"00",
"010",
"011",
"100",
"101",
"110",
"1110",
"11110",
"111110",
"1111110",
"11111110",
"111111110" };
typedef char ACHuffTableType[16][11][17]; // Huffman-Tabelle für Luminance-AC-Koeffizienten
ACHuffTableType Lum_AC_HuffmanTable= {
{ //Run == 0
"1010",//EOB
"00",
"01",
"100",
"1011",
"11010",
"1111000",
"11111000",
"1111110110",
"1111111110000010",
"1111111110000011"
},
{ //Run == 1
"1010",//EOB
"1100",
"11011",
"1111001",
"111110110",
"11111110110",
"1111111110000100",
"1111111110000101",
"1111111110000110",
"1111111110000111",
"1111111110001000"
},
{ //Run == 2
"1010",//EOB
"11100",
"11111001",
"1111110111",
"111111110100",
"1111111110001001",
"1111111110001010",
"1111111110001011",
"1111111110001100",
"1111111110001101",
"1111111110001110"
},
{ //Run == 3
"1010",//EOB
"111010",
"111110111",
"111111110101",
"1111111110001111",
"1111111110010000",
"1111111110010001",
"1111111110010010",
"1111111110010011",
"1111111110010100",
"1111111110010101"
},
{ //Run == 4
"1010",//EOB
"111011",
"1111111000",
"1111111110010110",
"1111111110010111",
"1111111110011000",
"1111111110011001",
"1111111110011010",
"1111111110011011",
"1111111110011100",
"1111111110011101",
},
{ //Run == 5
"1010",//EOB
"1111010",
"11111110111",
"1111111110011110",
"1111111110011111",
"1111111110100000",
"1111111110100001",
"1111111110100010",
"1111111110100011",
"1111111110100100",
"1111111110100101"
},
{ //Run == 6
"1010",//EOB
"1111011",
"111111110110",
"1111111110100110",
"1111111110100111",
"1111111110101000",
"1111111110101001",
"1111111110101010",
"1111111110101011",
"1111111110101100",
"1111111110101101"
},
{ //Run == 7
"1010",//EOB
"11111010",
"111111110111",
"1111111110101110",
"1111111110101111",
"1111111110110000",
"1111111110110001",
"1111111110110010",
"1111111110110011",
"1111111110110100",
"1111111110110101",
},
{ //Run == 8
"1010",//EOB
"111111000",
"111111111000000",
"1111111110110110",
"1111111110110111",
"1111111110111000",
"1111111110111001",
"1111111110111010",
"1111111110111011",
"1111111110111100",
"1111111110111101"
},
{ //Run == 9
"1010",//EOB
"111111001",
"1111111110111110",
"1111111110111111",
"1111111111000000",
"1111111111000001",
"1111111111000010",
"1111111111000011",
"1111111111000100",
"1111111111000101",
"1111111111000110"
},
{ //Run == 0xA
"1010",//EOB
"111111010",
"1111111111000111",
"1111111111001000",
"1111111111001001",
"1111111111001010",
"1111111111001011",
"1111111111001100",
"1111111111001101",
"1111111111001110",
"1111111111001111"
},
{ //Run == 0xB
"1010",//EOB
"1111111001",
"1111111111010000",
"1111111111010001",
"1111111111010010",
"1111111111010011",
"1111111111010100",
"1111111111010101",
"1111111111010110",
"1111111111010111",
"1111111111011000"
},
{ //Run == 0xC
"1010",//EOB
"1111111010",
"1111111111011001",
"1111111111011010",
"1111111111011011",
"1111111111011100",
"1111111111011101",
"1111111111011110",
"1111111111011111",
"1111111111100000",
"1111111111100001"
},
{ //Run == 0xD
"1010",//EOB
"11111111000",
"1111111111100010",
"1111111111100011",
"1111111111100100",
"1111111111100101",
"1111111111100110",
"1111111111100111",
"1111111111101000",
"1111111111101001",
"1111111111101010"
},
{ //Run == 0xE
"1010",//EOB
"1111111111101011",
"1111111111101100",
"1111111111101101",
"1111111111101110",
"1111111111101111",
"1111111111110000",
"1111111111110001",
"1111111111110010",
"1111111111110011",
"1111111111110100"
},
{ //Run == 0xF
"11111111001", //ZRL
"1111111111110101",
"1111111111110110",
"1111111111110111",
"1111111111111000",
"1111111111111001",
"1111111111111010",
"1111111111111011",
"1111111111111100",
"1111111111111101",
"1111111111111110"
}
};

![[重要]](../common/images/admon/important.png)


上一頁

