ビットマップ ソースのピクセルを変更する方法
このトピックでは、IWICBitmap コンポーネントと IWICBitmapLock コンポーネントを使用してビットマップ ソースのピクセルを変更する方法について説明します。
ビットマップ ソースのピクセルを変更するには
IWICImagingFactory オブジェクトを作成して、Windows イメージング コンポーネント (WIC) オブジェクトを作成します。
// Create WIC factory hr = CoCreateInstance( CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&m_pIWICFactory) );
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 );
イメージの最初の IWICBitmapFrameDecode を取得します。
// Retrieve the first bitmap frame. if (SUCCEEDED(hr)) { hr = pIDecoder->GetFrame(0, &pIDecoderFrame); }
JPEG ファイル形式では、1 つのフレームのみがサポートされます。 この例のファイルは JPEG ファイルであるため、最初のフレーム (
0
) が使用されます。 複数のフレームを持つイメージ形式については、「 イメージの各フレームにアクセスするためのイメージのフレームを取得する方法 」を参照してください。前に取得したイメージ フレームから 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 }
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);
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 を呼び出します。
作成されたオブジェクトをクリーンアップします。
SafeRelease(&pIBitmap); SafeRelease(&pIDecoder); SafeRelease(&pIDecoderFrame);
参照