请帮忙看下后台截图之后,获得HBITMAP的RGB分量的代码哪里有错误??

我用的VC2010,思路就是先printwindow后台截图,然后用GetDIBits获得HBITMAP中的像素信息,再获取相应的RGB分量来进行操作,现在printdows没有问题,也可以正常的在粘贴板中显示截图,就是这个RGB的信息老不对,不知道下面的代码哪里有差错,24位,32位BMP都尝试过,但是不对,请高手帮忙看看,是哪里错了,或者还有更好的方法来获得HBITMAP中的像素信息

C/C++ code

//==========================printwindow取色,这里没有问题===============
HWND temp=(HWND)0x3D08C6;
    HDC hscrdc = ::GetDC(NULL);
    RECT rc;
    ::GetClientRect(temp,&rc);
    HBITMAP hbitmap = CreateCompatibleBitmap(hscrdc, rc.right - rc.left, rc.bottom - rc.top);
    HDC hmemdc = CreateCompatibleDC(hscrdc);
    SelectObject(hmemdc, hbitmap);
    ::PrintWindow(temp,hmemdc,PW_CLIENTONLY);
         //================================定义BMP头文件信息,
    BITMAPINFO bmpInf;     
    bmpInf.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);   
    bmpInf.bmiHeader.biWidth = rc.right - rc.left;   
    bmpInf.bmiHeader.biHeight = rc.bottom - rc.top;   
    bmpInf.bmiHeader.biPlanes = 1;   
    bmpInf.bmiHeader.biBitCount = 24;   
    bmpInf.bmiHeader.biCompression = BI_RGB;   
    bmpInf.bmiHeader.biSizeImage =  0;
    bmpInf.bmiHeader.biXPelsPerMeter=0;
    bmpInf.bmiHeader.biYPelsPerMeter=0;
    bmpInf.bmiHeader.biClrUsed=0;
    bmpInf.bmiHeader.biClrImportant=0;
    
    //---------------------这里的公式都是套用网上来的,----------------     

    BYTE *ptemp=new BYTE[((bmpInf.bmiHeader.biWidth*bmpInf.bmiHeader.biBitCount+31)/8)*bmpInf.bmiHeader.biHeight;
    
    int Off;
    int pitch=bmpInf.bmiHeader.biWidth%4; 
    int x=10;
    int y=711;
    Off=(y*bmpInf.bmiHeader.biWidth+x)*3+y*pitch;

    GetDIBits(hmemdc,hbitmap,0,(UINT)(bmpInf.bmiHeader.biHeight),ptemp,&bmpInf,DIB_RGB_COLORS);
    BYTE B=ptemp[Off];
    BYTE g=ptemp[Off+1];
    BYTE r=ptemp[Off+2];
    

//==============这段是把BMP读到粘贴板的,也没有错误,显示的挺好...===========
    ::OpenClipboard(NULL);
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hbitmap);
    CloseClipboard();

    DeleteDC(hmemdc);
    DeleteObject(hbitmap);
    ::ReleaseDC(NULL, hscrdc);

作者: lanluosi2010   发布时间: 2011-06-16

位图的大小用GetObject来获取试试

作者: wltg2001   发布时间: 2011-06-16

to 1楼,谢谢您的指点,使用GetObject获得位图的大小之后,再去计算,结果对了,为什么之前直接使用确实错误的呢,希望您能再详细的介绍几句。

还有一个小问题,在网上的文章中都说,BMP中信息存放是从最后一行到第一行扫描,从左到右,而且是BGR的形式,还是上面的代码,我现在使用的32位图,按理应该是BGRA的形式,但是现在获得像素信息,通过和其他工具获得对比,却是RGBA的形式,不知道是我犯了什么小错误,还是其他原因?

作者: lanluosi2010   发布时间: 2011-06-16