Implementace IWICBitmapFrameEncode
IWICBitmapFrameEncode
IWICBitmapFrameEncode je protějškem kodéru IWICBitmapFrameDecode rozhraní. Toto rozhraní můžete implementovat do třídy kódování na úrovni rámce, což je třída, která provádí skutečné kódování bitů obrázků pro každý rámec.
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 );
};
- Inicializace
- SetSize a SetResolution
- SetPixelFormat
- SetColorContexts
- GetMetadataQueryWriter
- SetThumbnail
- WritePixels
- WriteSource
- potvrzení
- NastavitPaletu
Inicializovat
Initialize je první metodou vyvolanou na objektu IWICBitmapFrameEncode po instanciaci. Tato metoda má jeden parametr, který může být nastaven na NULL. Tento parametr představuje možnosti kodéru a je stejná IPropertyBag2 instance, kterou jste vytvořili v metodě CreateNewFrame dekodéru na úrovni kontejneru, a je předán zpět volajícímu v parametru pIEncoderOptions této metody. V té době jste naplnili strukturu IPropertyBag2 vlastnostmi, které představují možnosti kódování podporované kodérem na úrovni rámce. Volající nyní zadal hodnoty těchto vlastností, které určují parametry pro určité možnosti kódování, a předává stejný objekt zpět vám k inicializaci objektu IWICBitmapFrameEncode. Při kódování bitů obrázku byste měli použít zadané možnosti.
SetSize a SetResolution
SetSize a SetResolution jsou samovysvětlující. Volající pomocí těchto metod určuje velikost a rozlišení zakódovaného obrázku.
SetPixelFormat
SetPixelFormat se používá k vyžádání formátu pixelů, ve kterém se má obrázek kódovat. Pokud požadovaný formát pixelů není podporovaný, měli byste vrátit identifikátor GUID nejbližšího formátu pixelů, který je podporován v pPixelFormat, což je parametr in/out.
SetColorContexts
SetColorContexts slouží k určení jednoho nebo více platných kontextů barev (označovaných také jako profily barev) pro tento obrázek. Je důležité určit kontexty barev, takže aplikace, která později dekóduje obrázek, může převést ze zdrojového barevného profilu na cílový profil zařízení, které se používá k zobrazení nebo tisku obrázku. Bez barevného profilu není možné získat konzistentní barvy na různých zařízeních. To může být pro koncové uživatele frustrující, když jejich fotky vypadají jinak na různých monitorech a nemůžou získat otisky tak, aby odpovídaly tomu, co vidí na obrazovce.
GetMetadataQueryWriter
GetMetadataQueryWriter vrátí IWICMetadataQueryWriter, kterou může aplikace použít k vložení nebo úpravě konkrétních vlastností metadat v bloku metadat na snímku obrázku.
Můžete vytvořit instanci IWICMetadataQueryWriter zIWICComponentFactory několika způsoby. Můžete ho buď vytvořit z IWICMetadataBlockWriter, stejným způsobem, jako byl IWICMetadataQueryReader vytvořen z IWICMetadataBlockReader v metodě GetMetadataQueryReader na rozhraní IWICBitmapFrameDecode.
IWICMetadataQueryWriter* piMetadataQueryWriter = NULL;
HRESULT hr;
hr = m_piComponentFactory->CreateQueryWriterFromBlockWriter(
static_cast<IWICMetadataBlockWriter*>(this),
&piMetadataQueryWriter);
Můžete ho také vytvořit z existující IWICMetadataQueryReader, například z toho získaného pomocí předchozí metody.
hr = m_piComponentFactory->CreateQueryWriterFromReader(
piMetadataQueryReader, pguidVendor, &piMetadataQueryWriter);
Parametr pguidVendor umožňuje určit konkrétního dodavatele, který má být použit dotazovacím zapisovačem při vytváření instance zapisovače metadat. Pokud například poskytnete vlastní zapisovače metadat, možná budete chtít určit svůj vlastní identifikátor GUID dodavatele. Pokud nemáte předvolbu, můžete tomuto parametru předat NULL.
SetThumbnail
SetThumbnail slouží k zadání miniatury. Všechny obrázky by měly mít na každém snímku globálně miniaturu nebo obojí. Metody GetThumbnail a SetThumbnail jsou volitelné na úrovni kontejneru, ale pokud kodek vrátí WINCODEC_ERR_CODECNOTHUMBNAIL z metody getThumbnail GetThumbnail, vyvolá komponenta Windows Imaging Component (WIC) metodu GetThumbnail pro Frame 0. Pokud se miniatura nenajde v žádném z obou míst, musí WIC dekódovat celý obrázek a zmenšit ho na velikost miniatury, což by mohlo vést k velké zátěži výkonu u větších obrázků.
Miniatura by měla mít velikost a rozlišení, díky čemuž se dá rychle dekódovat a zobrazit. Z tohoto důvodu jsou miniatury nejčastěji obrázky VE FORMÁTU JPEG. Mějte na paměti, že pokud pro miniatury používáte jpeg, nemusíte psát kodér JPEG, který je kóduje, nebo dekódovač JPEG k jejich dekódování. Vždy byste měli delegovat na kodek JPEG, který je dodáván s platformou WIC pro kódování a dekódování miniatur.
WritePixels
WritePixels je metoda použitá k předávání skanovacích řádků z rastrového obrázku v paměti pro účely kódování. Metoda bude volána opakovaně, dokud nebudou předány všechny skenovací řádky. Parametr lineCount označuje, kolik řádků skenování má být zapsáno v tomto volání. Parametr cbStride označuje počet bajtů na čáru skenování. cbBufferSize označuje velikost vyrovnávací paměti předané v parametru pbPixels, který obsahuje skutečné bity obrázků, které mají být kódovány. Pokud je kombinovaná výška řádků skenování z kumulativních volání větší než výška zadaná metodou SetSize, vraťte WINCODEC_ERR_TOOMANYSCANLINES.
Pokud WICBitmapEncoderCacheOption je WICBitmapEncoderCacheInMemory, musí být skenovací řádky uloženy do mezipaměti, dokud nebudou všechny skenovací řádky předány. Pokud je možnost mezipaměti kodéru WICBitmapEncoderCacheTempFile, měly by se řádky skenování ukládat do mezipaměti v dočasném souboru, který se vytvoří při inicializaci objektu. V některém z těchto případů by image neměla být kódována, dokud volající neprovede Commit. V případě, že je možnost mezipaměti WICBitmapEncoderNoCache, měl by kodér kódovat skenovací řádky, jakmile jsou přijaty, pokud je to možné. (V některých formátech to není možné a řádky skenování musí být uloženy do mezipaměti, dokud není volána potvrzení.)
Většina nezpracovaných kodeků nebude implementovat WritePixels, protože nepodporují změnu bitů obrázků v nezpracovaných souborech. Surové kodeky by stále měly implementovat WritePixels, protože při přidání metadat se může zvětšit velikost souboru, což vyžaduje jeho znovu zápis na disk. V takovém případě je nutné zkopírovat existující bity obrázků, což je to, co dělá metoda WritePixels.
WriteSource
WriteSource se používá ke kódování IWICBitmapSource objektu. První parametr je ukazatel na objekt IWICBitmapSource. Druhý parametr je WICRect, který určuje oblast zájmu kódování. Tuto metodu lze volat několikrát po sobě, pokud je šířka každého obdélníku stejná šířka konečného obrázku, který se má zakódovat. Pokud se šířka obdélníku předaného v parametru prc liší od šířky zadané v metodě SetSize, vraťte WINCODEC_ERR_SOURCERECTDOESNOTMATCHDIMENSIONS. Pokud je kombinovaná výška skenovaných řádků z kumulativních volání větší než výška zadaná v metodě SetSize, vraťte WINCODEC_ERR_TOOMANYSCANLINES.
Možnosti mezipaměti fungují stejným způsobem u metody WritePixels, jak již bylo popsáno výše.
Zavázat se
Commit je metoda, která serializuje zakódované bity obrazu do datového proudu souboru a iteruje přes všechny zapisovače metadat snímku, aby je požádala o serializaci jejich metadat do proudu. V případě, kdy je možnost mezipaměti kodéru WICBitmapEncoderCacheInMemory nebo WICBitmapEncoderCacheTempFile, je tato metoda také zodpovědná za kódování obrázku a když je možnost mezipaměti WICBitmapEncoderCacheTempFile, Commit metoda by také měla odstranit dočasný soubor použitý k ukládání dat obrázku do mezipaměti před kódováním.
Tato metoda se vždy vyvolá poté, co byly všechny skenovací řádky nebo obdélníky tvořící obrázek předány pomocí metody Commit nebo WriteSource. Velikost konečného obdélníku, který se skládá při kumulovaných volání WritePixels nebo WriteSource, musí být stejná jako bylo specifikováno v metodě SetSize. Pokud velikost neodpovídá očekávané velikosti, měla by tato metoda vrátit WINCODECERROR_UNEXPECTEDSIZE.
Chcete-li iterovat přes zapisovače metadat a sdělit každému, aby serializoval svá metadata do datového proudu, použijte GetWriterByIndex k iteraci zapisovačů pro každý blok a na každý zapisovač metadat použijte IWICPersistStream.Save.
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);
...
}
NastavitPaletu
Pouze kodeky s indexovanými formáty musí implementovat metodu SetPalette. Pokud obrázek používá indexovaný formát, použijte tuto metodu k určení palety barev použitých v obrázku. Pokud váš kodek nemá indexovaný formát, vraťte WINCODEC_ERR_PALETTEUNAVAILABLE v rámci této metody.
Související témata
-
koncepční
-
implementace IWICBitmapCodecProgressNotification (Encoder)
-
implementace IWICMetadataBlockWriter