Condividi tramite


Implementazione di IWICBitmapSourceTransform

IWICBitmapSourceTransform

Anche se facoltativo, è consigliabile che ogni decodificatore implementi questa interfaccia nella classe di decodifica a livello di frame, perché può offrire notevoli vantaggi in termini di prestazioni. Quando un'applicazione richiede una specifica area di interesse, dimensioni, orientamento o formato pixel, anziché decodificare l'intera immagine a risoluzione completa e quindi applicare le trasformazioni richieste, Windows Imaging Component (WIC) chiama IUnknown::QueryInterface per questa interfaccia nell'oggetto IWICBitmapFrameDecode . Se il decodificatore di fotogrammi lo supporta, WIC chiama il metodo o i metodi appropriati per determinare se il decodificatore di fotogrammi può eseguire la trasformazione richiesta o determinare le dimensioni più vicine o il formato pixel che il decodificatore può fornire a quello richiesto. Se il decodificatore può eseguire la trasformazione o le trasformazioni richieste, WIC richiama CopyPixels con i parametri appropriati. Se il decodificatore può eseguire alcune trasformazioni, ma non tutte le trasformazioni richieste, WIC chiede al decodificatore di eseguire quelle che può eseguire e usa gli oggetti di trasformazione WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotator e IWICFormatConverter) per eseguire le trasformazioni rimanenti che non possono essere eseguite dal decodificatore di fotogrammi sul risultato della chiamata CopyPixels . Se il decodificatore non supporta IWICBitmapSourceTransform, WIC deve usare gli oggetti transform per eseguire tutte le trasformazioni. In genere è molto più efficiente per il decodificatore eseguire trasformazioni durante il processo di decodifica di quanto sia decodificare l'intera immagine e quindi eseguire le trasformazioni. Ciò vale soprattutto per le operazioni, ad esempio il ridimensionamento a una dimensione molto più piccola o le conversioni di formato pixel.

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 chiede se il decodificatore supporta l'operazione di rotazione o capovolgimento richiesta. Le opzioni WICBitmapTransformOptions che possono essere richieste sono:

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

CopyPixels

CopyPixels esegue il lavoro effettivo di decodifica dei bit dell'immagine, ad esempio il metodo CopyPixels nell'interfaccia IWICBitmapSource , ma il metodo CopyPixels in IWICBitmapSourceTransform è molto più potente e può migliorare significativamente le prestazioni di elaborazione delle immagini.

Quando vengono richieste più operazioni di trasformazione, il risultato dipende dall'ordine in cui vengono eseguite le operazioni. Per garantire la prevedibilità e la coerenza tra codec, è importante che tutti i codec eseguano queste operazioni nello stesso ordine. Questo è l'ordine canonico per l'esecuzione di queste operazioni.

  1. Scalabilità
  2. Ritaglia
  3. Ruota

La conversione del formato pixel può essere eseguita in qualsiasi momento, perché non ha alcun effetto sulle altre trasformazioni.

Il primo parametro , prcSrc, viene usato per specificare l'area di interesse per il ritaglio dell'immagine. Poiché il ridimensionamento viene eseguito prima del ritaglio per convenzione, se l'immagine deve essere ridimensionata e ritagliata, l'area di interesse deve essere determinata dopo che l'immagine è stata ridimensionata.

Il secondo e il terzo parametro indicano le dimensioni a cui ridimensionare l'immagine.

Il parametro pguidDstFormat indica il formato pixel richiesto per l'immagine decodificata. Poiché WIC ha già chiamato GetClosestPixelFormat, questo dovrebbe essere un formato pixel che il decodificatore ha indicato che supporta.

Il parametro dstTransform indica l'angolo di rotazione richiesto e se capovolgere l'immagine verticalmente, orizzontalmente o entrambe. Anche in questo caso, poiché WIC avrà già chiamato DoesSupportTransform, la trasformazione richiesta deve essere quella che il decodificatore ha già indicato che supporta. Tenere presente che la rotazione deve essere sempre eseguita dopo il ridimensionamento e il ritaglio.

GetClosestSize

GetClosestSize accetta due parametri in/out. Il chiamante usa i parametri puiWidth e puiHeight per specificare le dimensioni in cui il chiamante preferisce decodificare l'immagine. Tuttavia, un decodificatore può decodificare un'immagine solo a una dimensione che è un multiplo delle dimensioni DCT e formati di immagine diversi può avere dimensioni DCT diverse. Il decodificatore deve determinare, in base alle proprie dimensioni DCT, il più vicino può arrivare alla dimensione richiesta e impostare puiWidth e puiHeight su tali dimensioni al ritorno. Se è richiesta una dimensione maggiore, ma il codec non supporta la scalabilità a livello di upscaling, l'originale deve essere restituito.

GetClosestPixelFormat

GetClosestPixelFormat viene usato per determinare il formato pixel più vicino al formato pixel richiesto che il decodificatore può fornire senza perdita di dati. È sempre preferibile convertire in un formato pixel più ampio di uno più stretto, anche se aumenterà le dimensioni dell'immagine, perché può sempre essere riconvertito in un formato più restrittivo, se necessario. Tuttavia, dopo la perdita dei dati, non è possibile recuperarli.

Continua lettura

Per altre informazioni su come creare un codec abilitato per WIC, vedere Implementazione di IWICDevelopRaw.

Riferimento

IWICBitmapSourceTransform

IWICMetadataBlockReader

Informazioni concettuali

Implementazione di IWICMetadataBlockReader

Implementazione di IWICDevelopRaw

Come scrivere un codec WIC-Enabled

Panoramica del componente Windows Imaging