Freigeben über


Ä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

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

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

  7. Bereinigen von erstellten Objekten.

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

Weitere Informationen

Programmierhandbuch

Referenz

Beispiele