Udostępnij przez


Jak zmodyfikować piksele źródła mapy bitowej

W tym temacie pokazano, jak zmodyfikować piksele źródła mapy bitowej przy użyciu składników IWICBitmap i IWICBitmapLock.

Aby zmodyfikować piksele źródła mapy bitowej

  1. Utwórz obiekt IWICImagingFactory w celu utworzenia obiektów składnika Windows Imaging Component (WIC).

    // Create WIC factory
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&m_pIWICFactory)
        );
    
  2. Użyj metody CreateDecoderFromFilename, aby utworzyć IWICBitmapDecoder z pliku obrazu.

    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. Pobierz pierwszy IWICBitmapFrameDecode obrazu.

    // Retrieve the first bitmap frame.
    if (SUCCEEDED(hr))
    {
       hr = pIDecoder->GetFrame(0, &pIDecoderFrame);
    }
    

    Format pliku JPEG obsługuje tylko jedną ramkę. Ponieważ plik w tym przykładzie jest plikiem JPEG, używana jest pierwsza ramka (0). Aby zapoznać się z formatami obrazów z wieloma ramkami, zobacz Jak pobrać ramki obrazu w celu uzyskania dostępu do każdej ramki obrazu.

  4. Utwórz IWICBitmap z wcześniej uzyskanej ramki obrazu.

    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. Uzyskaj IWICBitmapLock dla określonego prostokąta 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. Przetwarzaj dane pikseli, które są teraz zablokowane przez obiekt 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);
       }
    }
    

    Aby odblokować IWICBitmap, wywołaj metodę IUnknown::Release na wszystkich obiektach IWICBitmapLock skojarzonych z IWICBitmap.

  7. Wyczyść utworzone obiekty.

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

Zobacz też

Przewodnik programowania

referencyjne

Przykładów