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 importanti 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 la dimensione più vicina o il formato pixel che il decodificatore può fornire a quello richiesto. Se il decodificatore può eseguire le trasformazioni 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ò, e usa gli oggetti di trasformazione WIC (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotatore 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 che per decodificare l'intera immagine e quindi eseguire le trasformazioni. Questo vale soprattutto per le operazioni come il ridimensionamento a una dimensione molto più piccola o 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 WICBitmapTransformOptions che possono essere richieste sono:

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

CopiaPixel

CopyPixels esegue il lavoro effettivo di decodifica dei bit dell'immagine, ad esempio il metodoCopyPixelssull'interfaccia IWICBitmapSource, ma il metodoCopyPixelssu 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. Scala
  2. Raccolto
  3. Ruotare

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 ritagliare l'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 deve 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.

OttieniDimensionePiùVicino

GetClosestSize accetta due parametri in/out. Il chiamante usa i parametri puiWidth e puiHeight per specificare le dimensioni in base alle quali il chiamante preferisce decodificare l'immagine. Tuttavia, un decodificatore può decodificare un'immagine solo a una dimensione costituita da più dimensioni DCT e formati di immagine diversi possono avere dimensioni DCT diverse. Il decodificatore deve determinare, in base alle proprie dimensioni DCT, la dimensione più vicina possibile a quella richiesta e impostare il puiWidth e puiHeight su tali dimensioni al momento del ritorno. Se viene richiesta una dimensione maggiore, ma il codec non supporta l'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 rispetto a 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 ulteriori informazioni su come creare un codec abilitato per WIC, vedere Implementare IWICDevelopRaw.

riferimento

IWICBitmapSourceTransform

IWICMetadataBlockReader

Concettuale

Implementare IWICMetadataBlockReader

Implementazione di IWICDevelopRaw

Come scrivere un WIC-Enabled CODEC

Panoramica della Componente di Imaging di Windows