我有一个win32程序,可以创建位图截图。我想弄清楚bmBits的x和y坐标。以下是我到目前为止的代码:
UINT32 nScreenX = GetSystemMetrics(SM_CXSCREEN);
UINT32 nScreenY = GetSystemMetrics(SM_CYSCREEN);
HDC hdc = GetDC(NULL);
HDC hdcScreen = CreateCompatibleDC(hdc);
HBITMAP hbmpScreen = CreateDIBSection( hdcDesk, ( BITMAPINFO* )&bitmapInfo.bmiHeader,DIB_RGB_COLORS, &bitmapDataPtr, NULL, 0 );
SelectObject(hdcScreen, hbmpScreen);
BitBlt(hdcScreen, 0, 0, nScreenX , nScreenY , hdc, 0, 0, SRCCOPY);
ReleaseDC(NULL, hdc);
BITMAP bmpScreen;
GetObject(hbmpScreen, sizeof(bmpScreen), &bmpScreen);
DWORD *pScreenPixels = (DWORD*)bmpScreen.bmBits,
UINT32 x = 0;
UINT32 y = 0;
UINT32 nCntPixels = nScreenX * nScreenY;
for(int n = 0; n < nCntPixels; n++)
{
x = n % nScreenX;
y = n / nScreenX;
//do stuff with the x and y vals
}
UINT32 nScreenY = GetSystemMetrics(SM_CYSCREEN);
HDC hdc = GetDC(NULL);
HDC hdcScreen = CreateCompatibleDC(hdc);
HBITMAP hbmpScreen = CreateDIBSection( hdcDesk, ( BITMAPINFO* )&bitmapInfo.bmiHeader,DIB_RGB_COLORS, &bitmapDataPtr, NULL, 0 );
SelectObject(hdcScreen, hbmpScreen);
BitBlt(hdcScreen, 0, 0, nScreenX , nScreenY , hdc, 0, 0, SRCCOPY);
ReleaseDC(NULL, hdc);
BITMAP bmpScreen;
GetObject(hbmpScreen, sizeof(bmpScreen), &bmpScreen);
DWORD *pScreenPixels = (DWORD*)bmpScreen.bmBits,
UINT32 x = 0;
UINT32 y = 0;
UINT32 nCntPixels = nScreenX * nScreenY;
for(int n = 0; n < nCntPixels; n++)
{
x = n % nScreenX;
y = n / nScreenX;
//do stuff with the x and y vals
}
代码对我来说似乎是对的,但是当我使用这段代码时,x和y值似乎是关闭的。 bmBits的第一个像素从哪里开始?当x和y都是0.是左上角,左下角,右下角还是右上角?
感谢。
答案 0 :(得分:2)
第一个像素通常是左下角,但如果将高度指定为负数,它可以是左上角。
扫描线从左到右排列。请注意,扫描线被填充到DWORD边界,因此“步幅”(从一条扫描线到下一条扫描线的距离)可能比线条的实际宽度略大一些。
答案 1 :(得分:0)
bmBits的第一个像素从哪里开始?当x和y都是0.是左上角,左下角,右下角还是右上角?
要回答这个问题,您可以在图像的每个角落构建一个具有独特颜色的图像。从那里只查询第一个像素。