跳至內容

應用手冊:JPEG 壓縮#

本應用說明詳細介紹了 Basler JPEG 壓縮 operators 的使用方式(應用說明 SAN013)。

您可以取得有關 operators 功能的資訊。透過 VisualApplets 設計,展示了一個 JPEG 壓縮應用程式。其中也介紹了一個可產生 JPEG 資料檔案的 SDK 專案。

在 VisualApplets 中進行 JPEG 壓縮需要兩個 operators。它們分別是 ImageBuffer_JPEG_Gray 會設為 JPEG_Encoder_Gray。Image buffer 用於在擷取卡 Memory 中緩衝影像資料,並用於對像素進行特定的重新排序。JPEG encoder 則負責執行實際的 JPEG 壓縮。

之所以需要重新排序像素,是因為 JPEG 壓縮使用的是 8x8 像素的區塊。下圖說明了此重新排序過程。

像素重新排序方案

重新排序後的影像將如下所示。該 operator 會維持原始影像的影像尺寸。

像素重新排序範例

完成重新排序後,即可使用 operator JPEG_Encoder_Gray執行 JPEG 壓縮。該 operator 的輸出是不含 JPEG 標頭的 Huffman 資料流。壓縮率取決於所選取的量化表,該量化表可在執行階段進行變更。針對 Huffman 編碼,使用的是標準亮度表。

Operator 文件

如需參數、輸入連結和 operator 功能的詳細說明,請參閱Operator Reference。

JPEG 壓縮設計範例#

以下設計範例將展示一個執行 JPEG 壓縮的 VisualApplets 設計。該設計需符合以下規格:

  • 從 Camera Link Base 面陣相機擷取影像。
  • 緩衝圖像數據並執行 JPEG 壓縮。
  • 在軟體中為圖像添加 JPEG 標頭,並將選定的圖像寫入文件。
  • 相機的圖像高度不是常數。變化的圖像高度必須添加到 JPEG 標頭中。

VisualApplets 設計#

以下設計用於滿足規格要求。

用於 JPEG 壓縮的 VisualApplets 設計

這個簡單的設計足以滿足所有規格要求。使用基礎面陣相機運算子擷取圖像。接著,圖像被分為兩個路徑。第一個路徑緩衝圖像並使用 ImageBuffer_JPEG_Gray 運算子執行像素重新排序。隨後使用 JPEG_Encoder_Gray 進行 JPEG 壓縮。JPEG 數據流透過 DMA 通道傳輸到主機 PC Memory 中。在第二個路徑中,原始圖像數據被緩衝並使用第二個 DMA 通道傳輸到主機 PC。

VisualApplets 設計模擬#

該設計可以完全模擬。透過在數據鏈路上放置模擬源和探針,可以監控 JPEG 壓縮的各自步驟。下圖顯示了帶有模擬模組的設計。如圖所示,原始圖像的像素(simModule0)被重新排序(simModule1),並生成了 JPEG 數據流(simModule2)。

JPEG 壓縮設計模擬

觀察 JPEG 數據時,可以確定數據流的長度(見下圖)。如果更改 JPEG 編碼器中的 Quality,數據長度也會相應變化。

SimProbe 中的 JPEG 資料

microDisplay 中的執行階段測試#

任何包含 JPEG Encoder 的 applet 都可以直接在 microDisplay 中使用。對於給定的範例,該 applet 會為每個 DMA 通道產生一個圖像視窗。DMA 編號 1 顯示擷取的原始圖像,而第一個 DMA 通道顯示編碼後的圖像數據以及 DMA 長度。

microDisplay 中的 JPEG Applet

用於 JPEG 檔案產生的 SDK 專案#

此範例的設計文件以及 SDK 範例專案可以在以下資料夾中找到: examples\processing\advanced\JPEG\JPEG_gray 位於 VisualApplets 安裝路徑中。

SDK 專案基本上會擷取原始圖像和 JPEG 數據。原始圖像直接輸出顯示。生成 JPEG 標頭並将其添加到 JPEG 數據中。這樣就完成了 JPEG 文件。使用者可以將 JPEG 快照寫入文件。此外,編碼後的 JPEG 數據使用簡單的 C 語言解碼器進行解碼 nanojpeg。解碼後的圖像將被顯示。

使用者可以調整圖像大小、更改 JPEG Quality、寫入 JPEG 快照文件或寫入 JPEG 數據十六進位文件轉儲。

請注意,標頭生成僅是一個範例。VisualApplets JPEG 運算子的使用者應編寫適用於其應用程式的自定義標頭生成器。

JPEG 解碼器資訊:

NanoJPEG -- KeyJ's Tiny Baseline JPEG Decoder

Version 1.0 (2009-04-29)

by Martin J. Fiedler <martin.fiedler@gmx.net>