實作 IWICBitmapSourceTransform
IWICBitmapSourceTransform
雖然是選擇性的,但強烈建議每個譯碼器在您的畫面層級譯碼類別上實作這個介面,因為它可以提供主要的效能優點。 當應用程式要求特定感興趣的區域、大小、方向或像素格式時,Windows 影像元件 (WIC) 不需完成全解析度的完整圖像解碼再進行所需轉換,而是可直接在這個 IWICBitmapFrameDecode 物件上,呼叫 IUnknown::QueryInterface 這個介面。 如果框架譯碼器支援它,WIC 會呼叫適當的方法或方法,以判斷框架譯碼器是否可以執行要求的轉換,或判斷譯碼器可以提供給要求的轉換最接近的大小或圖元格式。 如果解碼器能夠執行所要求的轉換,WIC 會使用適當的參數來調用 CopyPixels。 如果譯碼器可以執行某些轉換,但並非所有要求的轉換,WIC 會要求譯碼器執行其可執行的轉換, 並使用 WIC 轉換物件 (IWICBitmapScaler、IWICBitmapClipper、IWICBitmapFlipRotator、 和 IWICFormatConverter) 執行無法由框架譯碼器對 CopyPixels 呼叫結果執行的剩餘轉換。 如果譯碼器不支援 IWICBitmapSourceTransform,則 WIC 必須使用轉換對象來執行所有轉換。 譯碼器在譯碼過程中執行轉換通常比譯碼整個影像然後執行轉換更有效率。 對於調整為較小的大小或像素格式轉換等作業,這尤其如此。
interface IWICBitmapSourceTransform : IUnknown
{
// Required methods
HRESULT DoesSupportTransform ( WICTransformOptions dstTransform,
BOOL *pfIsSupported);
HRESULT CopyPixels ( WICRect *prcSrc,
UINT uiWidth,
UINT uiHeight,
WICPixelFormatGUID * pguidDstFormat,
WICBitmapTransformOptions dstTransform,
UINT nStride,
UINT cbBufferSize,
BYTE *pbBuffer );
// Optional methods
HRESULT GetClosestSize ( UINT *puiWidth,
UINT *puiHeight);
HRESULT GetClosestPixelFormat ( WICPixelFormatGUID *pguidDstFormat);
}
支援變換嗎
DoesSupportTransform 詢問譯碼器是否支援要求的旋轉或翻轉作業。 可以要求的 WICBitmapTransformOptions 如下:
enum WICBitmapTransformOptions
{
WICBitmapTransformRotate0,
WICBitmapTransformRotate90,
WICBitmapTransformRotate180,
WICBitmapTransformRotate270,
WICBitmapTransformFlipHorizontal,
WICBitmapTransformFlipVertical
}
CopyPixels
CopyPixels 會執行譯碼影像位的實際工作, 例如 IWICBitmapSource 介面上的 CopyPixels 方法,但 IWICBitmapSourceTransform 上的 CopyPixels 方法更強大,而且可以大幅改善影像處理效能。
要求多個轉換作業時,結果取決於執行作業的順序。 為了確保編解碼器之間的可預測性和一致性,所有編解碼器都以相同順序執行這些作業是很重要的。 這是執行這些作業的規範順序。
- 規模
- 作物
- 旋轉
圖元格式轉換可以隨時執行,因為它不會影響其他轉換。
第一個參數,prcSrc,用來指定要裁剪影像的區域。 按照慣例,由於縮放是在裁剪之前進行的,因此如果影像需要進行縮放和裁剪,則應在影像縮放後再確定感興趣的區域。
第二個和第三個參數表示要縮放影像的大小。
pguidDstFormat 參數表示譯碼影像的要求圖元格式。 因為 WIC 已經呼叫 GetClosestPixelFormat,這應該是解碼器表明支援的像素格式。
dstTransform 參數表示要求的旋轉角度,以及是否垂直、水準或兩者翻轉影像。 同樣地,因為 WIC 已經呼叫 DoesSupportTransform,所以所請求的轉換應該是譯碼器已經表示支援的。 請記住,應該一律在縮放和裁剪之後再執行旋轉。
GetClosestSize
GetClosestSize 接受兩個 in/out 參數。 呼叫端會使用 puiWidth 和 puiHeight 參數來指定呼叫端偏好譯碼影像的大小。 不過,譯碼器只能將影像譯碼成其DCT大小的倍數,而不同的影像格式可以有不同的DCT大小。 譯碼器應該根據自己的DCT大小來判斷最接近要求的大小,並將 puiWidth 和 puiHeight 設定為返回的維度。 如果要求較大的大小,但編解碼器不支援向上調整,則應該傳回原始的 。
GetClosestPixelFormat
GetClosestPixelFormat 是用來判斷譯碼器可在不遺失數據的情況下提供之要求圖元格式最接近要求的像素格式。 最好是將圖像轉換成更寬的圖元格式,即使這會增加影像的大小,因為如果有需要,也可以將其重新轉換成更受限制的格式。 不過,數據遺失之後,就無法復原。
繼續閱讀
若要深入瞭解如何建立已啟用 WIC 的編解碼器,請參閱 實作 IWICDevelopRaw。
相關主題
-
參考
-
概念