gpt4 book ai didi

c++ - 使用 GetDIBits 访问图像的像素颜色

转载 作者:行者123 更新时间:2023-11-28 08:02:05 30 4
gpt4 key购买 nike

我可以使用 GetDIBits 加载当前窗口的颜色内容,但我不知道如何从某个位置加载图像的颜色。谁能告诉我怎么做?

        char str[256];
HDC hdc;
HWND hDesktopWnd; HDC hDesktopDC; HDC hCaptureDC;
HBITMAP hCaptureBitmap; BITMAPINFO bmi = {0};
RGBQUAD *pPixels;
int nScreenWidth, nScreenHeight;
hdc = GetDC(hwnd);
GetWindowRect(hwnd,&rect);

hdc = GetDC(hwnd);
if(GetWindowRect(hwnd, &rect))
{
width = rect.right - rect.left;
height = rect.bottom - rect.top;
}

nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
hDesktopWnd = GetDesktopWindow();
hDesktopDC = GetDC(hwnd);
hCaptureDC = CreateCompatibleDC(hDesktopDC);
hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
SelectObject(hCaptureDC, hCaptureBitmap);
BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0,0, SRCCOPY|CAPTUREBLT);

bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = nScreenWidth;
bmi.bmiHeader.biHeight = nScreenHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

pPixels = new RGBQUAD[nScreenWidth * nScreenHeight];

::GetDIBits(hCaptureDC,
hCaptureBitmap,
0,
nScreenHeight,
pPixels,
&bmi,
DIB_RGB_COLORS);

我以这种方式将颜色加载到数组中

            for(int i= 0;i< nScreenHeight; i++){
for(int j= 0;j< nScreenWidth; j++){
col.red_palette[i][j] = pPixels[(nScreenWidth * (nScreenHeight-(i+1))) + j].rgbRed;
col.green_palette[i][j] = pPixels[(nScreenWidth * (nScreenHeight-(i+1))) + j].rgbGreen;
col.blue_palette[i][j] = pPixels[(nScreenWidth * (nScreenHeight-(i+1))) + j].rgbBlue;
}
}


delete [] pPixels;
ReleaseDC(hDesktopWnd, hDesktopDC);
DeleteDC(hCaptureDC);
DeleteObject(hCaptureBitmap);

我是 Windows 编程的新手,只想知道如何将图像加载到 hdc。

正如 Raymond 所建议的那样,我已将第二个参数传递为

HBITMAP hCaptureBitmap;
hCaptureBitmap = (HBITMAP)LoadImage( NULL, szFileName, IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

我仍然只捕获事件窗口的颜色,而不是图像的颜色。我如何更改设备句柄以反射(reflect)这一点。

HWND hDesktopWnd; HDC hDesktopDC; HDC hCaptureDC;
hDesktopWnd = GetDesktopWindow();
hDesktopDC = GetDC(hwnd);
hCaptureDC = CreateCompatibleDC(hDesktopDC);

最佳答案

RGBQUAD rgba = pPixels[y * nScreenWidth + x];

请注意,y=0 位于图像的底部,而不是您所期望的顶部。

关于c++ - 使用 GetDIBits 访问图像的像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11160773/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com