Megosztás a következőn keresztül:


Az IWICBitmapFrameEncode implementálása

IWICBitmapFrameEncode

IWICBitmapFrameEncode a kódoló megfelelője az IWICBitmapFrameDecode felületének. Ezt a felületet implementálhatja a keretszintű kódolási osztályon, amely az az osztály, amely az egyes keretek képbitjeinek tényleges kódolását végzi.

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

Inicializál

inicializálása az első metódus, amelyet a példányosítás után egy IWICBitmapFrameEncode objektumon hív meg. Ez a metódus egy paramétert tartalmaz, amely NULLértékre állítható be. Ez a paraméter a kódoló beállításait jelképezi, és ugyanaz az IPropertyBag2 példány, amelyet a tárolószintű dekóder CreateNewFrame metódusában hozott létre, majd ezt a példányt a metódus pIEncoderOptions paramétereként adja vissza a hívónak. Ekkor feltöltötte az IPropertyBag2 szerkezetet olyan tulajdonságokkal, amelyek a keretszintű kódoló által támogatott kódolási beállításokat jelölik. A hívó már megadott értékeket ezekhez a tulajdonságokhoz bizonyos kódolási beállításparaméterek jelzéséhez, és ugyanazt az objektumot adja vissza Önnek az IWICBitmapFrameEncode objektum inicializálásához. A képbitek kódolásakor a megadott beállításokat kell alkalmaznia.

SetSize és SetResolution

SetSize és SetResolution magától értetődőek. A hívó ezeket a metódusokat használja a kódolt kép méretének és felbontásának megadásához.

SetPixelFormat

SetPixelFormat képpontformátum kérésére szolgál, amelyben a kép kódolása történik. Ha a kért képpontformátum nem támogatott, akkor a támogatott legközelebbi képpontformátum GUID azonosítóját kell visszaadnia a pPixelFormatparaméterben, amely egy bemenő/kimeneti paraméter.

SetColorContexts

SetColorContexts egy vagy több érvényes színkörnyezet (más néven színprofil) megadására szolgál a képhez. Fontos megadni a színkörnyezeteket, hogy a rendszerképet később dekódoló alkalmazások a forrásszínprofilból a kép megjelenítésére vagy nyomtatására használt eszköz célprofiljára alakíthassák át. Színprofil nélkül nem lehet egységes színeket lekérni különböző eszközökön. Ez frusztráló lehet a végfelhasználók számára, ha a fényképeik eltérően néznek ki a különböző monitorokon, és nem kapják meg a képernyőn láthatóhoz hasonló nyomatokat.

GetMetadataQueryWriter

GetMetadataQueryWriter egy IWICMetadataQueryWriter ad vissza, amellyel egy alkalmazás beszúrhat vagy szerkeszthet bizonyos metaadat-tulajdonságokat a képkeret metaadatblokkjában.

Létrehozhat egy IWICMetadataQueryWriter-t a IWICComponentFactory segítségével több módon is. Ön létrehozhatja a IWICMetadataBlockWriter-t, ugyanúgy, ahogyan a IWICMetadataQueryReader-t létrehozták egy IWICMetadataBlockReader-ből a GetMetadataQueryReader metódusban az IWICBitmapFrameDecode interfészen.

IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;

hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter( 
      static_cast<IWICMetadataBlockWriter*>(this), 
      &piMetadataQueryWriter);

Létrehozhatja egy meglévő IWICMetadataQueryReaderis, például az előző módszerrel beszerzettből.

hr = m_piComponentFactory->CreateQueryWriterFromReader( 
      piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);

A pguidVendor paraméterrel megadhat egy adott szállítót a lekérdezésíró számára, amelyet a metaadat-írók példányosításakor használhat. Ha például saját metaadat-írókat ad meg, érdemes lehet saját szállítói GUID-t megadnia. Ha nincs preferenciája, akkor NULL továbbíthat ehhez a paraméterhez.

Bélyegkép beállítása

SetThumbnail előnézet megadására szolgál. Minden képnek globálisan, minden kereten vagy mindkettőn előnézeti képet kell megadnia. A GetThumbnail és SetThumbnail metódusok tárolószinten nem kötelezőek, de ha egy kodek WINCODEC_ERR_CODECNOTHUMBNAIL ad vissza a GetThumbnail metódusból, a Windows Képalkotó összetevő (WIC) meghívja a GetThumbnail metódust a 0. kerethez. Ha egyik helyen sem található miniatűr, a WIC-nek dekódolnia kell a teljes képet, és miniatűr méretre kell skáláznia, ami nagy teljesítménybeli büntetést okozhat a nagyobb képek esetében.

A miniatűrnek olyan méretűnek és felbontásúnak kell lennie, hogy gyorsan lehessen dekódolni és megjeleníteni. Ezért a miniatűrök leggyakrabban JPEG-képek. Vegye figyelembe, hogy ha JPEG-et használ a miniatűrökhöz, akkor nem kell JPEG-kódolót írnia a kódolásukhoz, vagy egy JPEG-dekódolót a dekódoláshoz. A miniatűrök kódolásához és dekódolásához mindig a WIC platformmal érkező JPEG-kodekhez kell delegálni.

WritePixels

WritePixels az a módszer, amellyel a memóriában lévő bitképek beolvasási sorait továbbítja kódolás céljából. A metódus többször meghívásra kerül, amíg az összes pásztázó vonal feldolgozásra nem került. A lineCount paraméter azt jelzi, hogy hány beolvasási sort kell írni ebben a hívásban. A cbStride paraméter a beolvasási sorbankénti bájtok számát jelzi. cbBufferSize a pbPixels paraméterben átadott puffer méretét jelzi, amely a kódolandó tényleges képbiteket tartalmazza. Ha az összeadott hívások beolvasási vonalainak összeadott magassága nagyobb, mint a SetSize metódusban megadott magasság, adja vissza a WINCODEC_ERR_TOOMANYSCANLINES hibakódot.

Ha a WICBitmapEncoderCacheOptionWICBitmapEncoderCacheInMemory, a scanline-okat a memóriában gyorsítótárazni kell, amíg az összes scanline be nem kerül. Ha a kódoló gyorsítótárazási beállítás WICBitmapEncoderCacheTempFile, a beolvasási sorokat egy ideiglenes fájlban kell gyorsítótárazni, amely az objektum inicializálásakor létrehozásra kerül. A képet egyik esetben sem szabad kódolni, amíg a hívó nem hívja Véglegesítés. Abban az esetben, ha a gyorsítótár-beállítás WICBitmapEncoderNoCache, a kódolónak a kapott módon kell kódolnia a beolvasási sorokat, ha lehetséges. (Bizonyos formátumokban ez nem lehetséges, és a beolvasási sorokat gyorsítótárazni kell, amíg a Commit hívásra kerül.)

A legtöbb nyers kodek nem implementálja WritePixels, mert nem támogatják a nyers fájl képbitjeinek módosítását. A nyers kodekeknek továbbra is implementálniuk kell WritePixels, mivel metaadatok hozzáadásakor növelheti a fájl méretét, és a fájlt újra kell írni a lemezen. Ebben az esetben képesnek kell lennie a meglévő képbitek másolására, ezt teszi a WritePixels metódus.

WriteSource

WriteSource egy IWICBitmapSource objektum kódolására szolgál. Az első paraméter egy IWICBitmapSource objektumra mutató mutató. A második paraméter egy WICRect, amely meghatározza a kódolni kívánt régiót. Ez a módszer egymás után többször is meghívható, ha az egyes téglalapok szélessége megegyezik a kódolandó végső kép szélességével. Ha a prc paraméterben átadott téglalap szélessége eltér a SetSize metódusban megadott szélességtől, térjen vissza a WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS hibakóddal. Ha az összegzett hívások beolvasási vonalainak együttes magassága meghaladja a SetSize metódusban megadott magasságot, adja vissza a WINCODEC_ERR_TOOMANYSCANLINES értéket.

A gyorsítótár beállításai ugyanúgy működnek ezzel a módszerrel, mint a korábban ismertetett WritePixels metódus esetében.

Elkötelez

Az az a módszer, amely szerializálja a kódolt képbiteket a fájlfolyamba, és végigmegy az összes metaadat-író elemén a keretben, megkérve őket, hogy szerializálják metaadataikat a folyamra. Abban az esetben, ha a kódoló gyorsítótárának beállítása WICBitmapEncoderCacheInMemory vagy WICBitmapEncoderCacheTempFile, ez a módszer a kép kódolásáért is felelős, és ha a gyorsítótár-beállítás WICBitmapEncoderCacheTempFile, a Véglegesítés metódusnak a kódolás előtt törölnie kell a képadatok gyorsítótárazásához használt ideiglenes fájlt is.

Ezt a metódust mindig meghívják, miután a képet alkotó összes vizsgálati sort vagy téglalapot átadták a Commit vagy WriteSource metódus használatával. A WritePixelsre vagy a WriteSource-ra irányuló halmozott hívásokon keresztül létrehozott utolsó téglalap méretének a SetSize metódusban megadott mérettel megegyező méretűnek kell lennie. Ha a méret nem felel meg a várt méretnek, ennek a metódusnak WINCODECERROR_UNEXPECTEDSIZE kell visszaadnia.

A metaadat-írók közötti iteráláshoz és annak elvégzéséhez, hogy az egyes metaadat-írók streambe szerializálják metaadataikat, hívja meg a GetWriterByIndex függvényt az egyes blokkok íróinak iterálásához, és használja az IWICPersistStream.Save parancsot minden metaadat-íróra.

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

A SetPalette metódust csak indexelt formátumokkal rendelkező kodekek implementálják. Ha egy kép indexelt formátumot használ, ezzel a módszerrel adja meg a képen használt színek palettáját. Ha a kodek nem rendelkezik indexelt formátummal, ebből a metódusból adja vissza WINCODEC_ERR_PALETTEUNAVAILABLE.

Fogalmi

IWICBitmapCodecProgressNotification (Encoder) implementálása

IWICMetadataBlockWriter implementálása

Hogyan írjunk egy WIC-Enabled CODEC-et

Windows képalkotó összetevő áttekintése