Delen via


IWICBitmapSourceTransform implementeren

IWICBitmapSourceTransform

Hoewel optioneel, raden we u ten zeerste aan dat elke decoder deze interface implementeert in uw coderingsklasse op frameniveau, omdat dit grote prestatievoordelen kan bieden. Wanneer een toepassing een specifiek interessegebied, grootte, afdrukstand of pixelformaat aanvraagt, in plaats van de hele afbeelding met volledige resolutie te decoderen en vervolgens de aangevraagde transformaties toe te passen, roept WIC (Windows Imaging Component) IUnknown::QueryInterface aan voor deze interface op de IWICBitmapFrameDecode object. Als de framedecoder dit ondersteunt, roept WIC de juiste methode of methoden aan om te bepalen of de framedecoder de gevraagde transformatie kan uitvoeren of de dichtstbijzijnde grootte of pixelindeling kan leveren die het meest overeenkomt met de aangevraagde. Als de decoder de aangevraagde transformatie of transformaties kan uitvoeren, roept WIC Copy Pixels aan met de juiste parameters. Als de decoder een aantal, maar niet alle aangevraagde transformaties kan uitvoeren, vraagt WIC de decoder om deze uit te voeren, en maakt gebruik van de WIC-transformatieobjecten (IWICBitmapScaler, IWICBitmapClipper, IWICBitmapFlipRotatoren IWICFormatConverter) om de resterende transformaties uit te voeren die niet door de framedecoder kunnen worden uitgevoerd op het resultaat van de Copy Pixels-aanroep. Als de decoder geen ondersteuning biedt voor IWICBitmapSourceTransform, moet WIC de transformatieobjecten gebruiken om alle transformaties uit te voeren. Het is meestal veel efficiƫnter voor de decoder om transformaties uit te voeren tijdens het decoderingsproces dan om de hele afbeelding te decoderen en vervolgens de transformaties uit te voeren. Dit geldt met name voor bewerkingen zoals het schalen naar een veel kleinere grootte of conversie van pixelindelingen.

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);
}

OndersteuntTransform

DoesSupportTransform vraagt of de decoder de aangevraagde draai- of wisselbewerking ondersteunt. De WICBitmapTransformOptions die kunnen worden aangevraagd zijn:

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

Copy Pixels

Copy Pixels het werkelijke werk van het decoderen van de afbeeldingsbits uitvoert, zoals de methode Copy Pixels op de interface IWICBitmapSource, maar de methode Copy Pixels op IWICBitmapSourceTransform is veel krachtiger en kan de prestaties van de verwerking van afbeeldingen aanzienlijk verbeteren.

Wanneer er meerdere transformatiebewerkingen worden aangevraagd, is het resultaat afhankelijk van de volgorde waarin de bewerkingen worden uitgevoerd. Om voorspelbaarheid en consistentie tussen codecs te garanderen, is het belangrijk dat alle codecs deze bewerkingen in dezelfde volgorde uitvoeren. Dit is de canonieke volgorde voor het uitvoeren van deze bewerkingen.

  1. Schaal
  2. Gewas
  3. Draaien

Conversie van pixelindeling kan op elk gewenst moment worden uitgevoerd, omdat deze geen effect heeft op de andere transformaties.

De eerste parameter, prcSrc, wordt gebruikt om het interessegebied op te geven voor het knippen van de afbeelding. Omdat volgens conventie schalen wordt uitgevoerd voordat de afbeelding wordt bijgesneden, dient het interessegebied te worden bepaald nadat de afbeelding is geschaald.

De tweede en derde parameters geven de grootte aan waarop de afbeelding moet worden geschaald.

De parameter pguidDstFormat geeft de aangevraagde pixelindeling voor de gedecodeerde afbeelding aan. Omdat WIC al GetClosest PixelFormatheeft aangeroepen, moet dit een pixelindeling zijn die de decoder heeft aangegeven dat deze wordt ondersteund.

De parameter dstTransform geeft de aangevraagde draaihoek aan en of de afbeelding verticaal, horizontaal of beide moet worden omgekeerd. Nogmaals, omdat WIC al DoesSupportTransformheeft aangeroepen, moet de aangevraagde transformatie een transformatie zijn die de decoder al heeft aangegeven dat deze wordt ondersteund. Houd er rekening mee dat de rotatie altijd moet worden uitgevoerd na het schalen en knippen.

KrijgDichtstbijZijndeMaat

GetClosestSize neemt twee in-/uit-parameters. De beller gebruikt de parameters puiWidth en puiHeight om de grootte op te geven waarop de beller de voorkeur geeft aan de afbeelding die moet worden gedecodeerd. Een decoder kan een afbeelding echter alleen decoderen naar een grootte van een veelvoud van de DCT-grootte en verschillende afbeeldingsindelingen kunnen verschillende DCT-grootten hebben. De decoder moet, op basis van zijn eigen DCT-grootte, bepalen hoe dicht hij bij de aangevraagde grootte kan komen en de puiWidth en puiHeight op die afmetingen instellen bij terugkeer. Als een grotere grootte wordt aangevraagd, maar de codec geen ondersteuning biedt voor upscaling, moet het origineel worden geretourneerd.

GetClosestPixelFormat

GetClosest PixelFormat wordt gebruikt om de dichtstbijzijnde pixelindeling te bepalen voor de aangevraagde pixelindeling die de decoder zonder verlies van gegevens kan bieden. Het verdient altijd de voorkeur om te converteren naar een bredere pixelindeling dan een smaller formaat, ook al wordt de afbeelding groter, omdat deze indien nodig altijd kan worden geconverteerd naar een meer beperkende indeling. Nadat de gegevens verloren zijn gegaan, kunnen deze echter niet worden hersteld.

Doorgaan met lezen

Zie IWICDevelopRaw implementerenvoor meer informatie over het maken van een codec met WIC-functionaliteit.

Referentie

IWICBitmapSourceTransform

IWICMetadataBlockReader

conceptuele

IWICMetadataBlockReader implementeren

IWICDevelopRaw implementeren

Een WIC-Enabled CODEC schrijven

Overzicht van Windows Imaging-onderdelen