如何将位图的字节转换为像素的x,y位置?

时间:2010-05-25 17:59:07

标签: winapi bitmap

我有一个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.是左上角,左下角,右下角还是右上角?

感谢。

2 个答案:

答案 0 :(得分:2)

第一个像素通常是左下角,但如果将高度指定为负数,它可以是左上角。

扫描线从左到右排列。请注意,扫描线被填充到DWORD边界,因此“步幅”(从一条扫描线到下一条扫描线的距离)可能比线条的实际宽度略大一些。

答案 1 :(得分:0)

  

bmBits的第一个像素从哪里开始?当x和y都是0.是左上角,左下角,右下角还是右上角?

要回答这个问题,您可以在图像的每个角落构建一个具有独特颜色的图像。从那里只查询第一个像素。