漸進式解碼概觀
本主題介紹漸進式解碼,以及如何在應用程式中使用漸進式解碼。 它也提供建立支援漸進式解碼的編解碼器的指導方針。
本主題包含下列各節。
簡介
漸進式解碼可讓您在整個影像完成下載之前,以累加方式解碼和轉譯影像的部分。 此功能可大幅改善從網際網路檢視影像時的使用者體驗,因為使用者不需要等待整個影像下載,才能開始解碼。 使用者能夠在下載整個影像之前,看到具有可用資料的影像預覽。 這項功能對於任何用來檢視來自網際網路或具有有限頻寬之資料來源的影像的應用程式而言都是不可或缺的。
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 影像。 右上方影像會顯示在漸進式層級 3 解碼的相同 PNG 影像。 底部影像會顯示在 7 個漸進式層級之後完全解碼的相同影像。
GIF 漸進式解碼
GIF 影像檔提供四個漸進式層級以進行解碼,如 GIF 規格中所述。 每個傳遞會在影像內填入特定資料列,並在第四次通過之後產生完整映射。 下表顯示解碼器每個階段所解碼的掃描行。
層級號碼/傳遞編號 | 填入掃描行 | 開始掃描行 |
---|---|---|
1 | 每八個掃描行 | 0 |
2 | 每八個掃描行 | 4 |
3 | 每四個掃描行 | 2 |
4 | 每秒掃描行 | 1 |
雖然編解碼器可以在任何特定層級指定空白圖元的內容,但 Windows GIF 編解碼器會藉由複寫空白掃描行上方的填入掃描行來填入空白掃描行。
應用程式中的漸進式解碼
主要漸進式解碼介面是 IWICProgressiveLevelControl 介面。 若要取得介面的參考,請查詢 IWICBitmapFrameDecode (IWICBitmapFrameDecode) ,以取得 IWICProgressiveLevelControl的影像框架。 接著可以從 介面存取漸進式方法。
下列程式碼提供在應用程式中使用漸進式解碼的範例。
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 探索和仲裁的需求。 不過,漸進式解碼可大幅提升使用者體驗,並盡可能考慮實作。
相關主題
-
概念
-
其他資源