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
- SetSize és SetResolution
- SetPixelFormat
- SetColorContexts
- GetMetadataQueryWriter
- Miniatűr beállítása
- WritePixels
- WriteSource
- véglegesítési
- BeállítaniPalettát
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.
Kapcsolódó témakörök
-
Fogalmi
-
IWICBitmapCodecProgressNotification (Encoder) implementálása
-
IWICMetadataBlockWriter implementálása