请帮忙看下后台截图之后,获得HBITMAP的RGB分量的代码哪里有错误??
我用的VC2010,思路就是先printwindow后台截图,然后用GetDIBits获得HBITMAP中的像素信息,再获取相应的RGB分量来进行操作,现在printdows没有问题,也可以正常的在粘贴板中显示截图,就是这个RGB的信息老不对,不知道下面的代码哪里有差错,24位,32位BMP都尝试过,但是不对,请高手帮忙看看,是哪里错了,或者还有更好的方法来获得HBITMAP中的像素信息
C/C++ code
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的形式,不知道是我犯了什么小错误,还是其他原因?
还有一个小问题,在网上的文章中都说,BMP中信息存放是从最后一行到第一行扫描,从左到右,而且是BGR的形式,还是上面的代码,我现在使用的32位图,按理应该是BGRA的形式,但是现在获得像素信息,通过和其他工具获得对比,却是RGBA的形式,不知道是我犯了什么小错误,还是其他原因?
作者: lanluosi2010 发布时间: 2011-06-16