Úprava pixelů zdroje rastrového obrázku
Toto téma ukazuje, jak upravit pixely rastrového zdroje pomocí IWICBitmap a IWICBitmapLock komponent.
Úprava pixelů zdroje rastrového obrázku
Vytvořte objekt IWICImagingFactory pro vytvoření objektů wic (Windows Imaging Component).
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );
Pomocí metody CreateDecoderFromFilename vytvořte IWICBitmapDecoder ze souboru obrázku.
HRESULT hr = S_OK; IWICBitmapDecoder *pIDecoder = NULL; IWICBitmapFrameDecode *pIDecoderFrame = NULL; hr = m_pIWICFactory->CreateDecoderFromFilename( L"turtle.jpg", // Image to be decoded NULL, // Do not prefer a particular vendor GENERIC_READ, // Desired read access to the file WICDecodeMetadataCacheOnDemand, // Cache metadata when needed &pIDecoder // Pointer to the decoder );
Získejte první IWICBitmapFrameDecode obrázku.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
Formát souboru JPEG podporuje pouze jeden rámec. Vzhledem k tomu, že soubor v tomto příkladu je soubor JPEG, použije se první snímek (
0
). Formáty obrázků, které mají více snímků, najdete v tématu Jak načíst rámce obrázku pro přístup k jednotlivým snímkům obrázku.Vytvořte IWICBitmap z dříve získaného obrazového snímku.
IWICBitmap *pIBitmap = NULL; IWICBitmapLock *pILock = NULL; UINT uiWidth = 10; UINT uiHeight = 10; WICRect rcLock = { 0, 0, uiWidth, uiHeight }; // Create the bitmap from the image frame. if (SUCCEEDED(hr)) { hr = m_pIWICFactory->CreateBitmapFromSource( pIDecoderFrame, // Create a bitmap from the image frame WICBitmapCacheOnDemand, // Cache bitmap pixels on first access &pIBitmap); // Pointer to the bitmap }
ZískejteIWICBitmapLock pro zadaný obdélník IWICBitmap.
if (SUCCEEDED(hr)) { // Obtain a bitmap lock for exclusive write. // The lock is for a 10x10 rectangle starting at the top left of the // bitmap. hr = pIBitmap->Lock(&rcLock, WICBitmapLockWrite, &pILock);
Zpracovat pixelová data, která jsou nyní uzamčena objektem IWICBitmapLock.
if (SUCCEEDED(hr)) { UINT cbBufferSize = 0; BYTE *pv = NULL; // Retrieve a pointer to the pixel data. if (SUCCEEDED(hr)) { hr = pILock->GetDataPointer(&cbBufferSize, &pv); } // Pixel manipulation using the image data pointer pv. // ... // Release the bitmap lock. SafeRelease(&pILock); } }
Pokud chcete odemknout IWICBitmap, použijte IUnknown::Release u všech objektů IWICBitmapLock přidružených k IWICBitmap.
Vyčistěte vytvořené objekty.
SafeRelease(&pIBitmap); SafeRelease(&pIDecoder); SafeRelease(&pIDecoderFrame);
Viz také