Implementera IWICBitmapFrameEncode
IWICBitmapFrameEncode
IWICBitmapFrameEncode är kodarens motsvarighet till IWICBitmapFrameDecode--gränssnittet. Du kan implementera det här gränssnittet på din kodningsklass på ramnivå, vilket är den klass som gör den faktiska kodningen av bildbitarna för varje bildruta.
interface IWICBitmapFrameEncode : public IUnknown
{
// Required methods
HRESULT Initialize ( IPropertyBag2 *pIEncoderOptions );
HRESULT SetSize ( UINT width,
UINT height );
HRESULT SetResolution ( double dpiX,
double dpiY );
HRESULT SetPixelFormat (WICPixelFormatGUID *pPixelFormat);
HRESULT SetColorContexts ( UINT cCount,
IWICColorContext **ppIColorContext );
HRESULT GetMetadataQueryWriter ( IWICMetadataQueryWriter
**ppIMetadataQueryWriter );
HRESULT SetThumbnail ( IWICBitmapSource *pIThumbnail );
HRESULT WritePixels ( UINT lineCount,
UINT cbStride,
UINT cbBufferSize,
BYTE *pbPixels );
HRESULT WriteSource ( IWICBitmapSource *pIWICBitmapSource,
WICRect *prc );
HRESULT Commit ( void );
// Optional method
HRESULT SetPalette ( IWICPalette *pIPalette );
};
- Initiera
- Setstorlek och Ställinlösning
- SetPixelFormat
- SetColorContexts
- GetMetadataQueryWriter
- SetThumbnail
- WritePixels
- WriteSource
- Commit
- SetPalette
Initiera
Initiera är den första metoden som anropas på ett IWICBitmapFrameEncode- objekt när det har instansierats. Den här metoden har en parameter som kan vara inställd på NULL-. Den här parametern representerar kodaralternativen och är samma IPropertyBag2 instans som du skapade i metoden CreateNewFrame på containernivåavkodaren och skickades tillbaka till anroparen i parametern pIEncoderOptions för den metoden. Då fyllde du i IPropertyBag2-structen med egenskaper som representerar kodningsalternativen som stöds av kodaren på ramnivå. Anroparen har nu angett värden för dessa egenskaper för att ange vissa kodningsalternativparametrar och skickar tillbaka samma objekt till dig för att initiera IWICBitmapFrameEncode-objektet. Du bör använda de angivna alternativen när du kodar bildbitarna.
Ställ in storlek och ställ in upplösning
SetSize och SetResolution är självförklarande. Anroparen använder dessa metoder för att ange storlek och upplösning för den kodade bilden.
SetPixelFormat
SetPixelFormat används för att begära ett pixelformat där bilden ska kodas. Om det begärda pixelformatet inte stöds bör du returnera GUID för det närmaste pixelformatet som stöds i pPixelFormat, som är en in/ut-parameter.
SetColorContexts
SetColorContexts används för att ange en eller flera giltiga färgkontexter (kallas även färgprofiler) för den här bilden. Det är viktigt att ange färgkontexterna, så att ett program som avkodar bilden vid ett senare tillfälle kan konvertera från källfärgprofilen till målprofilen för den enhet som används för att visa eller skriva ut bilden. Utan en färgprofil går det inte att få konsekventa färger på olika enheter. Detta kan vara frustrerande för slutanvändare när deras foton ser annorlunda ut på olika bildskärmar och de inte kan få utskrifterna att matcha vad de ser på skärmen.
GetMetadataQueryWriter
GetMetadataQueryWriter- returnerar en IWICMetadataQueryWriter- som ett program kan använda för att infoga eller redigera specifika metadataegenskaper i ett metadatablock i bildramen.
Du kan instansiera en IWICMetadataQueryWriter från IWICComponentFactory på flera sätt. Du kan antingen skapa den från din IWICMetadataBlockWriter, på samma sätt som IWICMetadataQueryReader skapades från en IWICMetadataBlockReader i metoden GetMetadataQueryReader på IWICBitmapFrameDecode-gränssnittet.
IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;
hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter(
static_cast<IWICMetadataBlockWriter*>(this),
&piMetadataQueryWriter);
Du kan också skapa den från en befintlig IWICMetadataQueryReader, till exempel den som erhölls med hjälp av föregående metod.
hr = m_piComponentFactory->CreateQueryWriterFromReader(
piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);
Med parametern pguidVendor kan du ange en viss leverantör som frågeskrivaren ska använda när du instansierar en metadataskrivare. Om du till exempel anger egna metadataskrivare kanske du vill ange ditt eget leverantörs-GUID. Du kan skicka NULL- till den här parametern om du inte har någon inställning.
AngeMiniatyrbild
SetThumbnail används för att ge en miniatyrbild. Alla bilder ska ge en miniatyrbild antingen globalt, på varje bildruta eller båda. Metoderna GetThumbnail och SetThumbnail är valfria på containernivå, men om en codec returnerar WINCODEC_ERR_CODECNOTHUMBNAIL från metoden GetThumbnail anropar Windows Imaging Component (WIC) metoden GetThumbnail för Frame 0. Om ingen miniatyrbild hittas på någon av dem måste WIC avkoda den fullständiga bilden och skala den till miniatyrstorlek, vilket kan medföra en stor prestandaavgift för större bilder.
Miniatyrbilden bör ha en storlek och upplösning som gör det snabbt att avkoda och visa. Därför är miniatyrbilder oftast JPEG-bilder. Observera att om du använder JPEG för dina miniatyrbilder behöver du inte skriva en JPEG-kodare för att koda dem eller en JPEG-avkodare för att avkoda dem. Du bör alltid delegera till JPEG-codec som levereras med WIC-plattformen för att koda och avkoda miniatyrbilder.
WritePixels
WritePixels är den metod som används för att skicka in genomsökningslinjer från en bitmapp i minnet för kodning. Metoden anropas upprepade gånger tills alla genomsökningslinjer har skickats in. Parametern lineCount anger hur många genomsökningsrader som ska skrivas i det här anropet. Parametern cbStride anger antalet byte per genomsökningslinje. cbBufferSize anger storleken på bufferten som skickas i pbPixels-parametern, som innehåller de faktiska bildbitarna som ska kodas. Om den kombinerade höjden på genomsökningslinjerna från kumulativa anrop är större än den höjd som anges i metoden SetSize returnerar du WINCODEC_ERR_TOOMANYSCANLINES.
När WICBitmapEncoderCacheOption är WICBitmapEncoderCacheInMemoryska genomsökningslinjerna cachelagras i minnet tills alla genomsökningslinjer har skickats in. Om cachealternativet för kodaren är WICBitmapEncoderCacheTempFileska genomsökningsraderna cachelagras i en temporär fil som skapas när objektet initieras. I något av dessa fall bör avbildningen inte kodas förrän anroparen anropar Commit. Om cachealternativet är WICBitmapEncoderNoCacheska kodaren koda genomsökningsraderna när de tas emot, om möjligt. (I vissa format är detta inte möjligt och genomsökningsraderna måste cachelagras tills Commit anropas.)
De flesta raw codecs implementerar inte WritePixelseftersom de inte stöder ändring av bildbitarna i raw-filen. Raw codecs bör fortfarande implementera WritePixels, men eftersom när metadata läggs till kan det öka storleken på filen, vilket kräver att filen skrivs om på disken. I så fall är det nödvändigt att kunna kopiera befintliga bildbitar, vilket är vad metoden WritePixels gör.
WriteSource
WriteSource- används för att koda ett IWICBitmapSource- objekt. Den första parametern är en pekare till ett IWICBitmapSource--objekt. Den andra parametern är en WICRect som anger vilken region av intresse som ska kodas. Den här metoden kan anropas flera gånger i följd, så länge bredden på varje rektangel har samma bredd som den slutliga bilden som ska kodas. Om bredden på rektangeln som skickas med prc-parametern skiljer sig från den bredd som anges i metoden SetSize, returnera WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS. Om den kombinerade höjden på genomsökningslinjerna från kumulativa anrop är större än den höjd som anges i SetSize-metoden returnerar du WINCODEC_ERR_TOOMANYSCANLINES.
Cachealternativen fungerar på samma sätt med den här metoden som med metoden WritePixels som beskrevs tidigare.
Begå
Commit är den metod som serialiserar kodade bildbitar till filströmmen och itererar genom alla metadataskrivare för ramen som begär att de ska serialisera sina metadata till dataströmmen. Om cachealternativet för kodaren är WICBitmapEncoderCacheInMemory eller WICBitmapEncoderCacheTempFile ansvarar den här metoden också för att koda avbildningen, och när cachealternativet är WICBitmapEncoderCacheTempFile bör metoden Commit också ta bort den tillfälliga fil som används för att cachelagra bilddata före kodning.
Den här metoden anropas alltid när alla genomsökningsrader eller rektanglar som utgör avbildningen har skickats in med hjälp av metoden Commit eller WriteSource. Storleken på den slutliga rektangel som består av de ackumulerade anropen till WritePixels eller WriteSource måste vara samma storlek som angavs i metoden SetSize. Om storleken inte matchar den förväntade storleken bör den här metoden returnera WINCODECERROR_UNEXPECTEDSIZE.
Om du vill iterera genom metadataskrivarna och be varje metadataskrivare att serialisera sina metadata går du till strömmen, anropar GetWriterByIndex för att iterera genom skrivarna för varje block och anropaR IWICPersistStream.Save på varje metadataskrivare.
IWICMetadataWriter* piMetadataWRiter = NULL;
IWICPersistStream* piPersistStream = NULL;
HRESULT hr;
for (UINT x=0; x < m_blockCount; x++)
{
hr = GetWriterByIndex(x, & piMetadataWriter);
hr = piMetadataWriter->QueryInterface(
IID_IWICPersistStream,(void**)&piPersistStream);
hr = piPersistStream->Save(m_piStream,
WICPersistOptions.WicPersistOptionDefault,
true);
...
}
SetPalette
Endast codecs som har indexerade format behöver implementera metoden SetPalette. Om en bild använder ett indexerat format använder du den här metoden för att ange paletten med färger som används i bilden. Om din codec inte har ett indexerat format returnerar du WINCODEC_ERR_PALETTEUNAVAILABLE från den här metoden.
Relaterade ämnen
-
konceptuell