漸進式譯碼概觀
本主題介紹漸進式譯碼,以及如何在應用程式中使用漸進式譯碼。 它也提供建立支援漸進式譯碼的編解碼器的指導方針。
本主題包含下列各節。
- 簡介
- 什麼是漸進式譯碼?
- Windows 7 中的 漸進式譯碼支援
- JPEG 漸進譯碼
- PNG/GIF 漸進式解碼
- 應用程式中的漸進式譯碼
- 自定義編解碼器對漸進式解碼的支援
- 相關主題
介紹
漸進式譯碼可讓您在完成整個影像下載之前,以累加方式譯碼和轉譯影像的部分。 這項功能可大幅改善從因特網檢視影像時的用戶體驗,因為使用者不需要等待整個影像下載,譯碼才能開始。 用戶能夠在下載整個映像之前,看到具有可用數據的影像預覽。 此功能對於任何用來檢視因特網影像或來自頻寬有限之數據源的應用程式而言都很重要。
Windows 7 中的 Windows 映射元件 (WIC) 支援漸進式譯碼熱門影像格式,例如 JPEG、PNG 和 GIF。 WIC 也支援任何啟用 WIC 的非Microsoft編解碼器,以實作漸進式譯碼。 目前版本的 WIC 不支援漸進式編碼。 本主題概述 Windows 7 中的漸進式譯碼,以及在您的應用程式中啟用漸進式譯碼的程式。
什麼是漸進式譯碼?
漸進式解碼是能夠從不完整的影像檔案中逐步解碼影像的部分。 傳統譯碼需要完整的圖像檔,才能開始譯碼。 漸進式解碼會在影像的某個漸進層級下載完成後開始。 譯碼器會在影像目前的漸進層級上執行譯碼傳遞。 然後它會在每個漸進層級下載時對映像執行多次解碼。 每個解碼階段都會顯示更多影像,直到影像完全下載並解碼為止。 譯碼完整影像所需的傳遞數目取決於影像檔格式和用來建立影像的編碼程式。
影像必須特別編碼,才能實作漸進式譯碼,但並非所有影像格式都支援它。 下列清單摘要說明使用漸進式譯碼的需求。
- 圖像文件必須支援漸進式譯碼。 大部分的影像格式都不支援漸進式譯碼,不過熱門的影像格式是 JPEG、PNG 和 GIF。
- 圖像文件必須編碼為漸進式影像。 未使用漸進式影像編碼建立的影像檔案無法實作漸進式譯碼,即使檔格式會支援它。
- 支援漸進式譯碼的編解碼器必須可供使用。 如果編解碼器不支援漸進式譯碼,則會將編碼為漸進影像的影像譯碼為傳統影像。
Windows 7 中的漸進式譯碼支援
Windows 7 提供內建編解碼器,可支援 JPEG、PNG 和 GIF 影像格式的漸進式譯碼。 每個 Windows 7 編解碼器都會在影像上執行多個譯碼傳遞。 每次處理對應於待解碼影像的特定層級和部分,最終形成完整解碼的影像。
每個影像格式會以不同的方式處理漸進式譯碼。 下表提供 Windows 7 漸進式譯碼格式所支援之漸進層級數目和譯碼方法的相關信息。
影像格式 | 支援的漸進式層級數目 | 漸進式譯碼方法 |
---|---|---|
JPEG | 由影像定義 | 增加解析度 |
PNG | 7 | 交錯 |
GIF(圖形交換格式) | 4 | 交錯 |
此外,漸進式譯碼可以藉由提供漸進式介面和方法的支援,在編解碼器中實作。 如果編解碼器不支援漸進式譯碼,則如果呼叫這些方法,應該傳回適當的錯誤訊息。
JPEG 漸進式譯碼
JPEG 漸進式譯碼會在每個層級逐步提高影像數據的解析度,直到完整解析度的影像可用為止。 影像的每個層級都會設定為提供不同的解析度層級。 隨著更漸進的層級可供使用,影像會顯示在較高解析解析度,直到解析完整解析度影像為止。
可用層級的數目和每個層級上設定的解析度完全取決於編碼的 JPEG。 下列兩個影像顯示 JPEG 漸進式譯碼在兩個漸進層級的範例。
左邊的影像在漸進層級 0 被解碼。 在五個漸進層級之後,右側的影像會完全解碼。
PNG/GIF 漸進譯碼
PNG 和 GIF 漸進式譯碼都使用交錯漸進譯碼方法。 這兩種格式的譯碼程式非常類似。
PNG 漸進譯碼
PNG 影像檔提供七個漸進式層級進行譯碼,如 PNG 規格中所述。 PNG 漸進式解碼是藉由在解碼器的每個過程中解碼指定的圖案來實現。 下表所示的模式為來自 PNG 規格,並在整個圖像上被複製。 每個數字都代表對應像素的解碼進階層級。
1 | 6 | 4 | 6 | 2 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
3 | 6 | 4 | 6 | 3 | 6 | 4 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
5 | 6 | 5 | 6 | 5 | 6 | 5 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
從上表中,您可以確定每次譯碼器處理時將被譯碼的圖元。 不同於 Windows 7 GIF 編解碼器,Windows 7 PNG 編解碼器會在掃描行上複寫最左邊可用的圖元,以填入空白圖元。
下列影像顯示三個漸進層級的 Windows 7 PNG 漸進譯碼範例。
左上方的圖像顯示了在漸進層級 0 解碼的 PNG 圖像。 右上方影像顯示同一 PNG 影像在漸進層級 3 被解碼的情況。 底部圖像是在經過 7 個漸進層級後完全解碼的同一張圖像。
GIF 漸進式譯碼
GIF 影像檔提供四個漸進式層級進行譯碼,如GIF規格中所述。 每個傳遞都會填入映像內的特定數據列,並在第四次傳遞之後產生完整映像。 根據 GIF 規範,下表顯示解碼器的每次掃描會解碼哪些掃描行。
層級號碼/傳遞號碼 | 已填入掃描線條 | 開始掃描行 |
---|---|---|
1 | 每八條掃描線 | 0 |
2 | 第八行掃描線 | 4 |
3 | 每四個掃描行 | 2 |
4 | 每秒掃描一行 | 1 |
雖然編解碼器可以在任何特定層級指定空白圖元的內容,但 Windows GIF 編解碼器是藉由複製空白掃描行上方的已填滿掃描行,來填補空白掃描行。
應用程式中的漸進式譯碼
主要的漸進式譯碼介面是 IWICProgressiveLevelControl介面。 若要取得介面的參考,請查詢 IWICProgressiveLevelControl的影像框架 (IWICBitmapFrameDecode)。 接著可以從介面存取漸進式方法。
下列程式代碼提供在應用程式中使用漸進式譯碼的範例。
IWICProgressiveLevelControl *pProgressive = NULL;
HRESULT hr = (pBitmapFrame->QueryInterface(
IID_IWICProgressiveLevelControl,
(void**) &pProgressive));
if (SUCCEEDED(hr))
{
for (UINT uCurrentLevel = 0; SUCCEEDED(hr); uCurrentLevel++)
{
hr = pProgressive->SetCurrentLevel(uCurrentLevel);
if (WINCODEC_ERR_INVALIDPROGRESSIVELEVEL == hr)
{
// No more levels
break;
}
if (SUCCEEDED(hr))
{
// Output the current level
hr = pBitmapFrame->CopyPixels(...);
}
}
}
if (pProgressive)
{
pProgressive->Release();
}
上述程式代碼提供在大部分應用程式中實作漸進式譯碼所需的基本功能。 使用程式代碼時,可以存取漸進層級,因為影像圖元數據可供使用。 SetCurrentLevel 函式會封鎖執行,直到要求的層級可供使用為止。
漸進式解碼的自定義編解碼器支援
編解碼器開發人員可以選擇實作 IWICProgressiveLevelControl,如果他們的影像格式支援漸進式譯碼。 支援漸進式譯碼並非 WIC 探索和仲裁的需求。 不過,漸進式譯碼可大幅提升用戶體驗,並盡可能考慮實作。
相關主題
-
概念
-
其他資源