비트맵 원본의 픽셀을 수정하는 방법
이 항목에서는 IWICBitmap 및 IWICBitmapLock 구성 요소를 사용하여 비트맵 원본의 픽셀 을 수정하는 방법을 보여 줍니다.
비트맵 원본의 픽셀을 수정하려면
IWICImagingFactory 개체를 만들어 WIC(Windows 이미징 구성 요소) 개체를 만듭니다.
// 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 파일 형식은 단일 프레임만 지원합니다. 이 예제의 파일은 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);
참고 항목