Ändern der Pixel einer Bitmapquelle
In diesem Thema wird veranschaulicht, wie die Pixel einer Bitmapquelle mithilfe der KOMPONENTEN IWICBitmap und IWICBitmapLock geändert werden.
So ändern Sie die Pixel einer Bitmapquelle
Erstellen Sie ein IWICImagingFactory-Objekt, um Windows WIC-Objekte (Imaging Component) zu erstellen.
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );Verwenden Sie die CreateDecoderFromFilename-Methode, um einen IWICBitmapDecoder aus einer Bilddatei zu erstellen.
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 );Sie erhalten den ersten IWICBitmapFrameDecode des Bilds.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }Das JPEG-Dateiformat unterstützt nur einen einzelnen Frame. Da die Datei in diesem Beispiel eine JPEG-Datei ist, wird der erste Frame (
0) verwendet. Informationen zu Bildformaten mit mehreren Frames finden Sie unter Abrufen der Frames eines Bilds für den Zugriff auf die einzelnen Frames des Bilds.Erstellen Sie eine IWICBitmap aus dem zuvor erhaltenen Bildrahmen.
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 }Abrufen eines IWICBitmapLock für ein angegebenes Rechteck der 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);Verarbeiten Sie die Pixeldaten, die jetzt vom IWICBitmapLock-Objekt gesperrt werden.
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); } }Um die IWICBitmap zuentsperren, rufen Sie IUnknown::Release für alle IWICBitmapLock-Objekte auf, die der IWICBitmap zugeordnet sind.
Bereinigt erstellte Objekte.
SafeRelease(&pIBitmap); SafeRelease(&pIDecoder); SafeRelease(&pIDecoderFrame);