Cómo modificar los píxeles de un origen de mapa de bits
En este tema se muestra cómo modificar los píxeles de un origen de mapa de bits mediante los componentes IWICBitmap e IWICBitmapLock .
Para modificar los píxeles de un origen de mapa de bits
Cree un objeto IWICImagingFactory para crear objetos componentes de creación de imágenes de Windows (WIC).
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );
Use el método CreateDecoderFromFilename para crear un IWICBitmapDecoder a partir de un archivo de imagen.
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 );
Obtenga el primer IWICBitmapFrameDecode de la imagen.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
El formato de archivo JPEG solo admite un marco único. Dado que el archivo de este ejemplo es un archivo JPEG, se usa el primer marco (
0
). Para los formatos de imagen que tienen varios fotogramas, consulte Cómo recuperar los fotogramas de una imagen para acceder a cada fotograma de la imagen.Cree un objeto IWICBitmap a partir del marco de imagen obtenido anteriormente.
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 }
Obtenga un IWICBitmapLock para un rectángulo especificado del objeto 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);
Procese los datos de píxeles que ahora está bloqueado por el objeto 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); } }
Para desbloquear IWICBitmap, llame a IUnknown::Release en todos los objetos IWICBitmapLock asociados con IWICBitmapmap.
Limpie los objetos creados.
SafeRelease(&pIBitmap); SafeRelease(&pIDecoder); SafeRelease(&pIDecoderFrame);
Consulte también