Ä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

  1. 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)
        );
    
  2. 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
       );
    
  3. 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.

  4. 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
    }
    
  5. 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);
    
  6. 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.

  7. Bereinigt erstellte Objekte.

    SafeRelease(&pIBitmap);
    SafeRelease(&pIDecoder);
    SafeRelease(&pIDecoderFrame);
    

Weitere Informationen

Programmierhandbuch

Referenz

Beispiele