求教 CreateDIBSection 100分 在线等
请不要被下面的代码数量吓到 关键就几句
我用CreateDIBSection 获取了一个LPVOID ppvBytes;
我现在就是不知道这个ppvBytes里面到底存的是什么
我想通过这个ppvBytes获取该位图各个像素点RGB值可以吗?
我用下面的代码做测试 就是给屏幕抓图 我试图输出ppvbytes各个点的颜色
但输出的结果似对非对的 能看出来说桌面的截图 但有两个缺点
1:图像是倒立的
2:每个的像素点似乎都变得暗淡了。
HDC hDesktopDC=CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
int nWidth=GetSystemMetrics(SM_CXSCREEN);
int nHeight=GetSystemMetrics(SM_CYSCREEN);
HDC hCaptureDC=CreateCompatibleDC(hDesktopDC);
CSize sizeWindow( nWidth, nHeight );
BITMAPINFOHEADER stBmpInfoHeader = { 0 };
int nBytesPerLine = ((sizeWindow.cx * 32 + 31) & (~31)) >> 3;
stBmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
stBmpInfoHeader.biWidth = sizeWindow.cx;
stBmpInfoHeader.biHeight = sizeWindow.cy;
stBmpInfoHeader.biPlanes = 1;
stBmpInfoHeader.biBitCount = 32;
stBmpInfoHeader.biCompression = BI_RGB;
stBmpInfoHeader.biClrUsed = 0;
stBmpInfoHeader.biSizeImage = nBytesPerLine * sizeWindow.cy;
PVOID pvBits = NULL;
HBITMAP hbmpMem = ::CreateDIBSection(NULL, (PBITMAPINFO)&stBmpInfoHeader, DIB_PAL_COLORS, &pvBits, NULL, 0);
if(hbmpMem != NULL)
{
memset( pvBits, 0, sizeWindow.cx * 4 * sizeWindow.cy);
if(hbmpMem)
{
HGDIOBJ hbmpOld = ::SelectObject( hCaptureDC, hbmpMem);
BitBlt(hCaptureDC,0,0,nWidth,nHeight,hDesktopDC,0,0,SRCCOPY);
}
}
::DeleteObject(hDesktopDC);
::DeleteObject(hCaptureDC);
CDC *pDC = GetDC();
BYTE *pBytes = (BYTE*)pvBits;
int size = sizeWindow.cx * 4 * sizeWindow.cy / 4;
COLORREF *pClrs = new COLORREF[size];
for ( int i = 0; i < size; i++ )
{
pClrs[i] = RGB( pBytes[i*4+1], pBytes[i*4+2], pBytes[i*4+3] );
}
for( int y = 0; y < 200; y++ )
{
for( int x = 0; x < nWidth; x++ )
{
pDC->SetPixel( CPoint(x,y), pClrs[nWidth*y + x]);
}
}