晕菜!!!GetPixel() 与 GetDIBits()得到的数据不一致!

aqua2013 2020-05-14 12:06:57
因为GetPixel()读取屏幕的速度实在太慢,所以用GDI的GetDIBits()函数和 BitBlt()函数来获取屏幕像素数据,但是实际使用时发现 对于普通窗口这两种方法都可以获得正确数据,然而对于游戏之类的窗口GetPixel()获得的数据是正确的,GetDIBits()不正常,但奇怪的是我用BitBlt()拷贝数据到我的程序窗口显示也是正确的,仅仅是用GetDIBits()获得的数据不一样,直接读缓冲区的方式都试过了,这个数据就是不一样,然而拿去显示又是正确的.我真是哭了

HDC hDc, hMemDC;
hDc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hDc);

HBITMAP hOldBmp, hBitmap;

hBitmap = CreateCompatibleBitmap(hDc, 62,20);
hOldBmp = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, 62, 20, hDc, 1703, 333, SRCCOPY);
HDC thdc = GetDC(hwnd);
BitBlt(thdc, 0, 0, 62, 20, hMemDC, 0, 0, SRCCOPY);
BitBlt(hMemDC, 0, 0, 62, 20, thdc, 62, 0, SRCCOPY);
{
BITMAPINFO bitmapInfo = { 0 };
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hMemDC, hBitmap, 0, 20, NULL, &bitmapInfo, DIB_RGB_COLORS);
unsigned char* bitmapBits = new unsigned char[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits, 0, bitmapInfo.bmiHeader.biSizeImage);//初始为0
//第二次才会有数据
GetDIBits(hMemDC, hBitmap, 0, 20, bitmapBits, &bitmapInfo, DIB_RGB_COLORS);
unsigned int rgb = GetPixel(hMemDC, 0, 0);
delete[]bitmapBits;
}
BitBlt(hMemDC, 0, 0, 62, 20, thdc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, thdc);

//第一次调用 GetDIBits函数,并将参数五置为NULL,且bitmapInfo的BITMAPINFOHEADER结构的biSize已经初始化过,
//函数将会把图像的宽,高还有整个图像所点的字节数填充到bitmapInfo结构中,以便接下来的使用
BITMAPINFO bitmapInfo = { 0 };
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hMemDC, hBitmap, 0, 20, NULL, &bitmapInfo, DIB_RGB_COLORS);
unsigned char* bitmapBits = new unsigned char[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits, 0, bitmapInfo.bmiHeader.biSizeImage);//初始为0
//第二次才会有数据
GetDIBits(hMemDC, hBitmap, 0, 20, bitmapBits, &bitmapInfo, DIB_RGB_COLORS);
unsigned int rgb=GetPixel(hMemDC, 0, 0);
...全文
273 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
aqua2013 2020-05-15
  • 打赏
  • 举报
回复
已经解决,用GetBitmapBits()函数就可以了
schlafenhamster 2020-05-15
  • 打赏
  • 举报
回复

void CVC60Doc::Save8BitBmp(HBITMAP hSrcBmp,char *fileName)
{// hSrcBmp is an 8 bits bmp.
char defFileName[MAX_PATH];
strcpy(defFileName,m_fileName);
char *slashAt=strrchr(defFileName,'\\');
if(slashAt) *slashAt=0;
if(hSrcBmp==m_hBmpRight)
{
strcat(defFileName,"\\Octree8.bmp");
}
else
{
strcat(defFileName,"\\Popularty8.bmp");
}
// bmp info
BITMAP bmp;
GetObject(hSrcBmp, sizeof(BITMAP), &bmp);
bmp.bmWidthBytes = (bmp.bmWidthBytes + 3) & ~3;
DWORD dwBitsSize = bmp.bmHeight * bmp.bmWidthBytes;//
//
DWORD dwHeaderSize = sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD));
LPBITMAPINFO lpbmi = NULL;
lpbmi = (LPBITMAPINFO)malloc(dwBitsSize);
lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biWidth = bmp.bmWidth;
lpbmi->bmiHeader.biHeight = bmp.bmHeight;
lpbmi->bmiHeader.biPlanes = 1;
lpbmi->bmiHeader.biBitCount = 8;
lpbmi->bmiHeader.biCompression = BI_RGB;
lpbmi->bmiHeader.biSizeImage = 0;
lpbmi->bmiHeader.biXPelsPerMeter = 0;
lpbmi->bmiHeader.biYPelsPerMeter = 0;
lpbmi->bmiHeader.biClrUsed = 256;
lpbmi->bmiHeader.biClrImportant = 256;
lpbmi->bmiHeader.biSizeImage = dwBitsSize;
//
HDC hDC = GetDC(NULL);
HDC hSourceDC = CreateCompatibleDC(hDC);
// we Select the src Object, for the info
HBITMAP hOldSourceBitmap = (HBITMAP)SelectObject(hSourceDC,hSrcBmp);
// Get colors
GetDIBColorTable(hSourceDC, 0, 256, lpbmi->bmiColors);
// Get bits
BYTE *Bits=new BYTE[dwBitsSize];
GetDIBits(hSourceDC,hSrcBmp,0,lpbmi->bmiHeader.biHeight,Bits,lpbmi,DIB_RGB_COLORS);//
// setback
SelectObject(hSourceDC, hOldSourceBitmap);
// we have all we need; do saving
FILE *p1;
if(fileName)
{
strcpy(defFileName,fileName);
}
p1 = fopen(defFileName,"wb");
// file head
BITMAPFILEHEADER headBMP;
headBMP.bfType='MB';
headBMP.bfSize=dwBitsSize;
headBMP.bfOffBits= sizeof(BITMAPFILEHEADER) +// 14
sizeof(BITMAPINFOHEADER) +// 40
sizeof(RGBQUAD)*256;
headBMP.bfReserved1=0;
headBMP.bfReserved2=0;
// file write
fwrite(&headBMP, 1, sizeof(BITMAPFILEHEADER), p1);//14
fwrite(lpbmi, 1, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,p1);//40 + 4*256 colors
fwrite(Bits, 1, dwBitsSize, p1);// Dibs
fclose(p1);
// free
delete []Bits;
DeleteDC(hSourceDC);
ReleaseDC(NULL, hDC);
free(lpbmi);
//
AfxMessageBox(CString("8 Bits BitMap '") + defFileName +"' Saved!");
}
schlafenhamster 2020-05-14
  • 打赏
  • 举报
回复
不是要 取 color 吗?
// Get colors
GetDIBColorTable(hSourceDC, 0, 256, lpbmi->bmiColors);
// Get bits
BYTE *Bits=new BYTE[dwBitsSize];
GetDIBits(hSourceDC,hSrcBmp,0,lpbmi->bmiHeader.biHeight,Bits,lpbmi,DIB_RGB_COLORS);//

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧