Поделиться через


Изменение пикселей источника растрового изображения

В этом разделе показано, как изменить пиксели источника растрового изображения с помощью компонентов IWICBitmap и IWICBitmapLock .

Изменение пикселей источника растрового изображения

  1. Создайте объект IWICImagingFactory , чтобы создать объекты windows Imaging Component (WIC).

    // Create WIC factory
    hr = CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&m_pIWICFactory)
        );
    
  2. Используйте метод CreateDecoderFromFilename , чтобы создать IWICBitmapDecoder из файла изображения.

    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. Получите первый IWICBitmapFrameDecode изображения.

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

    Формат файла JPEG поддерживает только один кадр. Так как файл в этом примере является JPEG-файлом, используется первый кадр (0). Сведения о форматах изображений с несколькими кадрами см. в разделе Получение кадров изображения для доступа к каждому кадру изображения.

  4. Создайте IWICBitmap из ранее полученного кадра изображения.

    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. Получите IWICBitmapLock для указанного прямоугольника 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. Обработайте пиксельные данные, заблокированные объектом 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);
       }
    }
    

    Чтобы разблокировать IWICBitmap, вызовите IUnknown::Release для всех объектов IWICBitmapLock , связанных с IWICBitmap.

  7. Очистка созданных объектов.

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

См. также:

Руководство по программированию

Справочные материалы

Примеры