ビットマップ ソースのピクセルを変更する方法

このトピックでは、IWICBitmap コンポーネントと IWICBitmapLock コンポーネントを使用してビットマップ ソースのピクセルを変更する方法について説明します。

ビットマップ ソースのピクセルを変更するには

  1. IWICImagingFactory オブジェクトを作成して、Windows イメージング コンポーネント (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 ファイル形式では、1 つのフレームのみがサポートされます。 この例のファイルは 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. IWICBitmap の指定した四角形の IWICBitmapLock を取得します。

    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 のロックを解除するには、IWICBitmap に関連付けられているすべての IWICBitmapLock オブジェクトで IUnknown::Release を呼び出します

  7. 作成されたオブジェクトをクリーンアップします。

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

参照

プログラミング ガイド

参照

サンプル