CRect rect(CPoint(0, 0), CPoint(m_pdoc->m_FollowImg.cols, m_pdoc->m_FollowImg.rows)); LPBYTE lpPixel; LONG nWidth = m_pdoc->m_FollowImg.cols + 4 - m_pdoc->m_FollowImg.cols % 4; LONG nHeight = m_pdoc->m_FollowImg.rows; BITMAPINFOHEADER bmiHeader = { sizeof(BITMAPINFOHEADER), nWidth, -nHeight, 1, 16, BI_RGB, 0, 0, 0, 0, 0 }; HDC hMemDC = CreateCompatibleDC(NULL); HBITMAP hMemBmp = CreateDIBSection(NULL, reinterpret_cast<BITMAPINFO *>(&bmiHeader), DIB_RGB_COLORS, reinterpret_cast<void **>(&lpPixel), NULL, 0); HGDIOBJ hOldBmp = SelectObject(hMemDC, hMemBmp);创建一个这样的位图以及后lpPixel怎么在两个函数中对其进行绘制然后使用lpPixel拿到绘制后的数据出来
时间: 2024-04-15 22:29:24 浏览: 138
要在两个函数中对位图进行绘制并使用 `lpPixel` 获取绘制后的数据,你可以按照以下步骤进行操作:
首先,在创建位图对象后,你可以在两个函数中分别使用设备上下文 `hMemDC` 进行绘制操作:
```cpp
void DrawOnBitmap1()
{
// 选择位图对象到设备上下文
HGDIOBJ hOldBmp = SelectObject(hMemDC, hMemBmp);
// 在 hMemDC 上进行第一次绘制操作
// ...
// 恢复原来的位图对象
SelectObject(hMemDC, hOldBmp);
}
void DrawOnBitmap2()
{
// 选择位图对象到设备上下文
HGDIOBJ hOldBmp = SelectObject(hMemDC, hMemBmp);
// 在 hMemDC 上进行第二次绘制操作
// ...
// 恢复原来的位图对象
SelectObject(hMemDC, hOldBmp);
}
```
在上述示例中,我们在函数中使用 `SelectObject` 函数将位图对象选入设备上下文 `hMemDC`,然后在 `hMemDC` 上进行绘制操作。绘制完成后,我们使用 `SelectObject` 函数恢复原来的位图对象。
接下来,你可以使用 `lpPixel` 来获取绘制后的位图数据。注意,这些绘制操作必须在 `SelectObject` 函数恢复原来的位图对象之后进行:
```cpp
void GetBitmapData()
{
// 获取位图信息
BITMAP bitmap;
GetObject(hMemBmp, sizeof(BITMAP), &bitmap);
// 计算位图数据大小
int dataSize = bitmap.bmWidthBytes * bitmap.bmHeight;
// 创建缓冲区用于存储位图数据
BYTE* pBuffer = new BYTE[dataSize];
// 复制位图数据到缓冲区
memcpy(pBuffer, lpPixel, dataSize);
// 使用 pBuffer 中的位图数据进行后续处理
// ...
// 释放缓冲区内存
delete[] pBuffer;
}
```
在上述示例中,我们首先使用 `GetObject` 函数获取位图对象的信息,包括宽度、高度等。然后,我们根据位图信息计算出位图数据的大小,并创建一个缓冲区 `pBuffer` 来存储位图数据。使用 `memcpy` 函数将位图数据从 `lpPixel` 复制到缓冲区中。最后,你可以使用缓冲区中的位图数据进行后续处理。
希望这些步骤对你有所帮助!如果还有其他问题,请随时提问。
阅读全文