请不要被下面的代码数量吓到 关键就几句
我用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]);
}
}

解决方案 »

  1.   

    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]);
    }
      

  2.   

    其实就是想问
    那个ppvBytes是啥 如何从它获取各个点的RGB值
      

  3.   

    1:图像是倒立的// 原本 就 如此
    2:每个的像素点似乎都变得暗淡了。// 为什么 是  DIB_PAL_COLORS ?
      

  4.   

    谢谢 schlafenhamster 
    我开始使用的是DIB_RGB_COLORS因为出现描述的问题 所以换的您能告诉我得到这个buffer(pvBits)后 怎样通过这个buffer获得每个像素的颜色呢
      

  5.   

    pClrs[i] = RGB( pBytes[i*4+2], pBytes[i*4+1], pBytes[i*4+0] );