如何修改位图源的像素
本主题演示如何使用 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);
另请参阅