HD 相片格式概觀
本主題提供透過 Windows 映射元件 (WIC) 提供的原生 (內建) HD 相片編解碼器的相關信息。
編解碼器身分識別
下表提供編解碼器識別資訊。
元件 | 描述 |
---|---|
正式名稱 | HD 相片、Windows 媒體相片 |
檔案名稱副檔名 | wdp |
MIME 類型 | image/vnd.ms-photo |
檔案簽章 | 前四個字節:0x4949bc00 (版本 0; 發行前版本), 0x4949bc01 (版本 1.0) |
下表列出用來識別原生 HD 相片編解碼器元件的 GUID。
元件 | 易記名稱 | GUID(全域唯一識別碼) |
---|---|---|
容器格式 | GUID_ContainerFormatWmp | 57a37caa-367a-4540-916bf183c5093a4b |
譯碼器 | CLSID_WICWmpDecoder | a26cec36-234c-4950-ae16e34aace71d0d |
編碼器 | CLSID_WICWmpEncoder | ac4ce3cb-e1c1-44cd-82155a1665509ec2 |
編碼
WIC 編碼 API 的設計目的是要與編解碼器無關,且啟用 WIC 的編解碼器的影像編碼基本上相同。 如需使用 WIC API 進行影像編碼的詳細資訊,請參閱 編碼概觀。
編碼器選項
啟用 WIC 的編解碼器在編碼選項層級上有所不同。 編碼器選項反映影像編碼器的功能,而每個原生編解碼器都支援一組這些編碼器選項。 編碼器選項可以是所有啟用 WIC 之程式代碼的基本 WIC 支援選項(雖然不一定支援),或由影像格式編解碼器所設計之編解碼器特定選項。 為了在編碼過程中管理這些編碼選項,WIC 會使用 IPropertyBag2 介面 。 如需使用 IPropertyBag2 介面進行 WIC 編碼的詳細資訊,請參閱 編碼概觀。
HD 相片編解碼器同時使用基本的 WIC 選項,並提供數個 HD 相片特定的編碼選項。 下表列出原生 HD 相片編解碼器支援的編碼器選項。
基本 WIC 編碼器選項
屬性名稱 | VARTYPE | 值範圍 | 預設值 |
---|---|---|---|
ImageQuality | VT_R4 | 0 - 1.0 | 0.9 |
無損失 | VT_BOOL | TRUEFALSE | FALSE |
BitmapTransform | VT_UI1 | WICBitmapTransformOptions | WICBitmapTransformRotate0 |
HD 相片特定編碼器選項
屬性名稱 | VARTYPE | 值範圍 | 預設值 |
---|---|---|---|
UseCodecOptions | VT_BOOL | TRUE, FALSE | 錯誤 |
品質 | VT_UI1 | 1 - 255 | 10 |
重疊 | VT_UI1 | 0 - 2 | 1 |
子採樣 | VT_UI1 | 0 - 3 | 如果 ImageQuality > 0.8,則為 3;否則為 1; |
HorizontalTileSlices | VT_UI2 | 0 - 4095 | (影像寬度 – 1) >> 8 |
垂直瓷磚切片 | VT_UI2 | 0 - 4095 | (圖像高度 – 1) >> 8 |
頻率順序 | VT_BOOL | 真假 | TRUE |
交錯式Alpha | VT_BOOL | TRUE, FALSE | 假 |
AlphaQuality | VT_UI1 | 1 - 255 | 1 |
CompressedDomainTranscode | VT_BOOL | 真假 | TRUE |
ImageDataDiscard | VT_UI1 | 0 - 3 | 0 |
AlphaDataDiscard | VT_UI1 | 0 - 4 | 未使用。 |
IgnoreOverlap | VT_BOOL | 真假 | FALSE |
如果編碼器選項存在於編解碼器不支援的 IPropertyBag2 選項清單中,則會予以忽略。
ImageQuality 選項
指定所需的影像逼真度。 0.0 表示可能的精確度最低,而 1.0 會指定最高的逼真度。 針對 HD 相片影像格式,1.0 值會產生數學上的無損失壓縮。
預設值為 0.9。
CompressionQuality 選項
指定所需的壓縮品質。 0.0 表示可用的有效壓縮架構。 一般而言,此架構會產生更快的編碼但較大的輸出。 值為 1.0 會指定最有效率的壓縮架構,這通常會產生較長的編碼,但輸出較小。
HD 相片不支援此編碼器選項。 如果 IPropertyBag2 參數清單中存在,則會忽略此值。
無遺失選項
指定是否要使用損失壓縮模式。 針對 HD 相片影像格式,此值會覆寫 ImageQuality 選項值。
預設值 FALSE。
BitmapTransform 選項
說明影像在解碼過程中的轉換方式。 您必須將此選項設定為其中一個 WICBitmapTransformOptions 列舉值。
預設值為 WICBitmapTransformOptions::WICBitmapTransformRotate0。
UseCodecOptions 選項
如果值為 VARIANT_TRUE,則使用 Quality、Overlap和 Subsampling 選項,而不是選項值。
預設值 FALSE。
質量選項
指定影像的壓縮品質。 值為 1 表示無損失模式。 增加值會導致較高的壓縮比例和較低的影像品質。
預設值為 10。
重疊選項
指定重疊處理的層級。
下表列出可用的重疊處理層級。
價值 | 描述 |
---|---|
0 | 未啟用重疊處理。 |
1 | 啟用一個層級的重疊處理,根據鄰近區塊的值修改 4x4 區塊編碼值。 |
2 | 已啟用兩種重疊處理層級。 除了第一層處理之外,16x16 巨集區塊的編碼值也會根據鄰近巨集區塊的值進行修改。 |
預設值為 1。
子取樣選項
指定色度空間中的額外壓縮。 如此一來,您可以保留亮度細節,但會犧牲色彩細節。 此選項僅適用於 RGB 影像。
下表列出可用的子取樣選項。
價值 | 描述 |
---|---|
3 | 4:4:4 編碼會保留完整的色度解析度。 |
2 | 4:2:2 編碼會將色度解析度減少為1/2的亮度解析度。 |
1 | 4:2:0 編碼會將色度解析度減少為亮度解析度的 1/4。 |
0 | 4:0:0 編碼會捨棄所有色度內容,並只保留亮度。 由於編解碼器會使用稍微修改的亮度定義來改善效能,因此建議您先將 RGB 影像轉換成單色,再編碼,而不是使用此色度子取樣模式。 |
如果 imageQuality > 0.8,則預設值為 3;否則為 1。
HorizontalTileSlices、VerticalTileSlices 選項
在執行壓縮編碼之前,請先指定圖像的水平和垂直平鋪,以達到區域解碼的最佳效能。 藉由在編碼期間將影像分割成矩形磚,您可以譯碼影像的區域,而不需要處理整個壓縮數據流。 默認值 0 不指定任何細分,因此會將整個影像視為單一磚。 每個參數的值為 1 時會創建一條水平和一條垂直分割線,將影像有效地分割成四個相同大小的瓷磚。 每個參數的最大值 4095 會將影像分割成 4096 個磚列,每列有 4096 個磚。 也就是說,參數值分別等於水平及垂直的磚塊數目減1。 磚的寬度或高度永遠不能小於 16 像素,因此 HD 相片編碼器可能會調整此參數,以維持所需的最小磚大小。 由於每個磚都有相關聯的儲存和處理額外負荷,因此您應該仔細選擇這些值,以符合特定案例。
HorizontalTileSlices:預設值為 [影像寬度 – 1] >> 8。
VerticalTileSlices:預設值為 [影像高度 – 1] >> 8。
FrequencyOrder 選項
指定影像必須以頻率順序編碼。 最低頻率數據會先出現在檔案中,影像內容會依其頻率分組,而不是其空間方向。 依頻率順序組織檔案可為任何以頻率為基礎的譯碼提供最佳效能,因此建議您使用。 HD Photo 編碼器的裝置實作可以組織檔案的空間,以減少編碼期間所需的記憶體使用量。
預設值為 TRUE,我們建議應用程式和裝置始終使用頻率順序,除非您有性能或針對應用程式的特定原因來使用空間順序。
InterleavedAlpha 選項
將此選項設定為 TRUE 會指示編解碼器將 Alpha 色板資訊編碼為額外的交錯通道,而與影像內容通道沒有任何關聯。 當您需要在串流情境中與影像同時解碼 Alpha 通道時,此模式非常有用。
將此參數設定為 FALSE 會產生一個平面 Alpha 通道,並以其自身的可選 Quality 值編碼為獨立影像。 藉由使用平面 alpha 通道,您可以獨立解碼影像數據和 alpha 通道。 只有特定的 RGB 像素格式才支援交錯的 Alpha 通道。 您可以將平面 Alpha 通道與任何具有 Alpha 通道的影像格式產生關聯。
預設值 FALSE。
AlphaQuality 選項
指定平面 Alpha 色板影像的壓縮品質。 值為 1 會設定無損失模式。 增加值會導致較高的壓縮比例和較低的影像品質。
預設值為 1。
「CompressedDomainTranscode」選項
藉由使用 HD Photo,您可以執行數個檔案轉換作業,而不需要實際譯碼壓縮的數據,並將它重新編碼至目的地檔案。 壓縮域中的操作非常有效率,而且在解碼和重新編碼有損壓縮圖像時,避免了常見的額外品質損失。
支援下列壓縮網域作業:
- 裁剪影像的區域。
- 執行旋轉/翻轉轉換。
- 捨棄頻率資料(讓您能夠建立較小的影像檔。)
- 在空間和頻率順序之間重新組織影像。
HD Photo 編碼器在使用 HD Photo 解碼器作為影像來源對 HD Photo 影像進行編碼時,會執行壓縮域轉碼作業。 視您選取的編碼選項而定,編解碼器會盡可能使用壓縮網域作業。 如果應用程式選擇明確禁止任何壓縮網域轉碼作業,您應該將 UseCodecOptions 選項設定為 TRUE,而 CompressedDomainTranscode 選項 FALSE。
當編解碼器執行壓縮網域作業時,只允許特定的編碼器參數和屬性設定。
- 系統會忽略 ImageQuality、CompressionQuality 和 Lossless 的基本編碼器選項。
- 會忽略 HD Photo 特定的編碼選項 Quality、Overlap、交錯式 Alpha 和 Alpha Quality。
- 如果存在,HorizontalTileSlices 和 VerticalTileSlices 選項必須設定為零。 影像的區塊大小無法改變為壓縮域轉碼的一部分。
- 您可以藉由指定 FrequencyOrdering 選項的適當值,在頻率與空間順序之間變更影像組織。
- 基本旋轉和/或水平/垂直翻轉作業可以依據 BitmapTransform 編碼器選項中指定的值來執行。
- 您可以使用 WriteSource 編碼器方法的 WICRect 參數,指定所需的區域來裁剪影像。
- 您可以在 ImageDataDiscard 和/或 AlphaDataDiscard 選項中指定適當的值,以捨棄影像和/或 alpha 資料,從而減少編碼檔案的大小,並有效地降低新影像的解析度。
默認值為 TRUE。我們建議各位在應用程式或裝置中一律使用頻率順序,除非您有特定的效能或應用程式原因需要使用空間順序。
ImageDataDiscard 選項
只有當 CompressedDomainTranscode 選項 TRUE時,此參數才有效;否則會忽略它。 ImageDataDiscard 指定要在壓縮領域轉碼期間丟棄的影像數據量。 如果影像包含交錯的 Alpha 通道,此數據捨棄也會套用至 Alpha 通道,但本節稍後會說明例外狀況。
允許下列值。
價值 | 描述 |
---|---|
0 | 不會捨棄任何影像頻率數據。 |
1 | FlexBits 會被捨棄,任意減少轉碼影像的品質,而不會變更影像的有效解析度。 確切的檔案大小縮減或特定品質降低取決於許多因素,無法指定或預測。 如果您為交錯的 Alpha 通道指定這個值,它會回報錯誤。 |
2 | 在轉碼過程中,HighPass 頻率數據帶(包括 FlexBits)會被捨棄,從而有效地在水平方向和垂直方向上將影像解析度降低至原來的四分之一。 轉碼影像的實際維度保持不變,但每 4x4 像素區塊都會遺失所有詳細數據。 因此,每當解碼時,您應該相應地縮小轉碼後的影像的取樣。 |
3 | HighPass 和 LowPass 頻率數據頻帶都會捨棄(這也包括 FlexBits),有效地將轉碼影像的解析度降低為兩個維度的 16 倍。 轉碼影像的實際維度保持不變,但它會在每個 16x16 像素的巨集區塊中遺失所有詳細數據。 因此,每當解碼影像時,您應該相應地縮小轉碼影像的尺寸。 |
預設值為 0。
AlphaDataDiscard 選項
只有當 CompressedDomainTranscode 屬性為 TRUE 且影像包含平面或交錯的 Alpha 通道時,此選項才有效;否則會忽略它。 它會指定要在壓縮網域轉碼期間捨棄的 Alpha 頻率數據量。 平面阿爾法通道允許下列值。
價值 | 描述 |
---|---|
0 | 不會捨棄任何影像頻率數據。 |
1 | FlexBits 會被捨棄,隨機降低轉碼影像的平面Alpha通道品質,而不改變有效解析度。 確切的檔案大小縮減或特定品質降低取決於許多因素,無法指定或預測。 |
2 | HighPass 頻率數據帶會被捨棄(也包含 FlexBits),有效地將轉碼影像平面 Alpha 色板的解析度降低為兩個維度中的 4 倍。 轉碼影像的實際維度保持不變,但影像會在每個 4x4 像素區塊中遺失所有平面 Alpha 色板詳細數據。 因此,每當解碼轉碼影像時,應相應向下取樣。 一般而言,只有當您將 ImageDataDiscard 屬性設定為相同的值時,才應該設定此值。 |
3 | HighPass 和 LowPass 頻率數據頻帶都會捨棄(這也包括 FlexBits),有效地將轉碼影像的解析度降低為兩個維度的 16 倍。 轉碼影像的實際維度保持不變,但影像會在每個 16x16 的圖元巨集區塊中遺失所有詳細數據。 因此,每當解碼影像時,應相應地對轉碼影像進行向下取樣。 一般而言,只有當您將 ImageDataDiscard 屬性設定為相同的值時,才應該設定此值。 |
4 | Alpha通道已被完全捨棄。 轉碼影像的像素格式會變更,以反映移除Alpha通道。 |
針對包含交錯 Alpha 通道的影像,除非此屬性設定為 4,否則 Alpha 通道的處理會與影像數據相同,並依據 ImageDataDiscard 屬性的值進行。 如果此屬性設定為 4,交錯的 Alpha 通道會完全捨棄,並相應地改變轉碼影像的像素格式。
沒有預設值。
IgnoreOverlap 選項
只有當 CompressedDomainTranscode 屬性 TRUE 且要求一或多個磚的子區域轉碼時,此選項才有效。 區域轉碼(或解碼)的預設操作是將指定的區域展開,包含進行區域邊緣重疊解碼所需的周圍像素。 當此參數設定為 TRUE時,會忽略周圍圖元,而且只會擷取選取的磚或磚。 同樣地,這需要所要求的區域完全對應一或多個瓷磚的座標。 如果來源影像未平鋪,或要求的區域指定任何部分平鋪區塊,則會忽略此參數。
預設值 FALSE。
解碼
WIC 譯碼 API 是設計成與編解碼器無關的程式代碼,且啟用 WIC 的編解碼器的影像譯碼基本上相同。 如需影像譯碼的詳細資訊,請參閱 譯碼概觀。 如需使用譯碼影像資料的詳細資訊,請參閱 位圖來源概觀。
IWICBitmapSourceTransform 支援
除了啟用 WIC 的編解碼器所需的介面之外,原生 HD Photo 解碼器也支援 IWICBitmapSourceTransform。 IWICBitmapSourceTransform 介面提供譯碼影像位數據流的進階選項。 而不是僅透過使用 IWICBitmapFrameDecode傳回完整的影像,IWICBitmapSourceTransform 介面啟用了以下的解碼器選項。
- 解碼影像的矩形子區域。
- 解碼至較低的解析度
- 解碼為不同的像素格式
- 譯碼時執行轉換 (旋轉/翻轉)
原生 HD Photo 編解碼器為 IWICBitmapSourceTransform介面提供如下支援層級:。
DoesSupportTransform
原生實作支援所有 WICBitmapTransformOptions 轉換。
獲取最接近的大小
對於要求尺寸在兩個維度上均小於來源影像一半的情況,HD Photo 會返回下一個大於且能被 2 整除的最大整數影像大小。 針對所有其他要求的大小,HD Photo 會傳回原始影像尺寸。
GetClosestPixelFormat
HD Photo 會傳回編碼影像的像素格式。
CopyPixels
HD Photo 接受 WICRect 參數所指定的任何要求區域,並傳回該部分的影像。
uiWidth 和 uiHeight 參數必須指定 GetClosestSize 函式所傳回的維度。 任何其他值都傳回錯誤。
pguidDstFormat 參數必須指定 getClosestPixelFormat 函式所傳回的像素格式。 任何其他值會傳回錯誤。
HD Photo 接受 dstTransform 參數的任何允許值。 請注意,WIC 針對此參數所允許的值與 HD Photo 用於轉換元數據標記的值不同。