Ändern der Pixel einer Bitmapquelle
In diesem Thema wird veranschaulicht, wie Sie die Pixel einer Bitmapquelle mithilfe der Komponenten IWICBitmap und IWICBitmapLock ändern.
So ändern Sie die Pixel einer Bitmapquelle
Erstellen Sie ein IWICImagingFactory-Objekt , um WIC-Objekte (Windows 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 Imagedatei 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 );
Rufen Sie den ersten IWICBitmapFrameDecode des Bilds ab.
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
Das JPEG-Dateiformat unterstützt nur einen einzelnen Frame. Da es sich bei der Datei in diesem Beispiel um eine JPEG-Datei handelt, wird der erste Frame (
0
) verwendet. Bildformate mit mehreren Frames finden Sie unter Abrufen der Frames eines Bilds für den Zugriff auf jeden Frame des Bilds.Erstellen Sie eine IWICBitmap aus dem zuvor abgerufenen 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 }
Rufen Sie einen IWICBitmapLock für ein angegebenes Rechteck der IWICBitmap ab.
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 sind.
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 zu entsperren, rufen Sie IUnknown::Release für alle IWICBitmapLock-Objekte auf, die der IWICBitmap-Karte zugeordnet sind.
Bereinigen von erstellten Objekten.
SafeRelease(&pIBitmap); SafeRelease(&pIDecoder); SafeRelease(&pIDecoderFrame);
Weitere Informationen