共用方式為


實作 IWICBitmapSourceTransform

IWICBitmapSourceTransform

雖然是選擇性的,但我們強烈建議每個解碼器在您的畫面層級解碼類別上實作此介面,因為它可以提供主要效能優勢。 當應用程式要求感興趣的特定區域、大小、方向或像素格式時,而不是只以完整解析度解碼整個影像,然後在IWICBitmapFrameDecode物件上套用要求的轉換時,Windows 映像元件 (WIC) 呼叫IUnknown::QueryInterface作為此介面。 如果框架解碼器支援,WIC 會呼叫適當的方法或方法來判斷框架解碼器是否可以執行要求的轉換,或判斷解碼器可以提供給所要求之轉換的最接近大小或像素格式。 如果解碼器可以執行要求的轉換或轉換,WIC 會使用適當的參數叫用 CopyPixels 。 如果解碼器可以執行一些, 但並非所有要求的轉換,WIC 會要求解碼器執行它可以執行的轉換,並使用 WIC 轉換物件 (IWICBitmapScaler、IWICBitmapClipperIWICBitmapFlipRotatorIWICFormatConverter) ,以在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

DoesSupportTransform 會詢問解碼器是否支援要求的旋轉或翻轉作業。 可能要求的 WICBitmapTransformOptions 如下:

enum WICBitmapTransformOptions
{   
   WICBitmapTransformRotate0,
   WICBitmapTransformRotate90,
   WICBitmapTransformRotate180,
   WICBitmapTransformRotate270,
   WICBitmapTransformFlipHorizontal,
   WICBitmapTransformFlipVertical
}

CopyPixels

CopyPixels會執行解碼影像位的實際工作,例如IWICBitmapSource介面上的CopyPixels方法,但IWICBitmapSourceTransform上的CopyPixels方法會更強大,而且可以大幅改善影像處理效能。

要求多個轉換作業時,結果取決於執行作業的順序。 為了確保編解碼器的可預測性和一致性,所有編解碼器都以相同循序執行這些作業非常重要。 這是執行這些作業的規範順序。

  1. 調整
  2. Crop
  3. Rotate

像素格式轉換可以隨時執行,因為它不會影響其他轉換。

第一個參數 中國Src是用來指定裁剪影像感興趣的區域。 由於縮放是在依慣例裁剪之前執行,因此如果影像要調整及裁剪,則應該在縮放影像之後判斷感興趣的區域。

第二個和第三個參數會指出要調整影像的大小。

pguidDstFormat參數表示解碼影像的要求像素格式。 因為 WIC 已經呼叫 GetClosestPixelFormat,所以這應該是解碼器已指出其支援的像素格式。

dstTransform參數會指出要求的旋轉角度,以及要垂直、水準或兩者翻轉影像。 同樣地,因為 WIC 已經呼叫 DoesSupportTransform,所以要求的轉換應該是解碼器已經指出它支援的轉換。 請記住,縮放和裁剪之後應該一律執行旋轉。

GetClosestSize

GetClosestSize 會採用兩個 in/out 參數。 呼叫端會使用 puiWidthpuiHeight 參數來指定呼叫端偏好解碼影像的大小。 不過,解碼器只能將影像解碼成其 DCT 大小的倍數,而不同的影像格式可以有不同的 DCT 大小。 解碼器應該根據自己的 DCT 大小來決定最接近要求的大小,並在傳回時將 puiWidthpuiHeight 設定為那些維度。 如果要求較大的大小,但編解碼器不支援向上調整,則應該傳回原始專案。

GetClosestPixelFormat

GetClosestPixelFormat 可用來判斷解碼器可在不遺失資料的情況下,最接近要求的像素格式。 最好轉換成比較窄的像素格式更寬,即使它會增加影像的大小,因為它在必要時一律可以反轉為更嚴格的格式。 不過,資料遺失之後,就無法復原。

繼續閱讀

若要深入瞭解如何建立已啟用 WIC 功能的編解碼器,請參閱 實作 IWICDevelopRaw

參考

IWICBitmapSourceTransform

IWICMetadataBlockReader

概念

實作 IWICMetadataBlockReader

實作 IWICDevelopRaw

如何撰寫WIC-Enabled CODEC

Windows 映像元件概觀