gpt4 book ai didi

c - 字节数组有问题/捕获屏幕截图

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:51 24 4
gpt4 key购买 nike

大家好,我有以下代码:

#define ScreenXResolution GetDeviceCaps(GetDC(0), HORZRES)
#define ScreenYResolution GetDeviceCaps(GetDC(0), VERTRES)

BYTE *screenData = malloc(sizeof(BYTE) * (3 * ScreenXResolution * ScreenYResolution));
captureScreenshot(&screenData);

void captureScreenshot(BYTE *screenData)
{
HDC hdc = GetDC(NULL), hdcMem = CreateCompatibleDC(hdc);
HBITMAP hBitmap = CreateCompatibleBitmap(hdc, ScreenXResolution, ScreenYResolution);
BITMAPINFOHEADER bmi = {0};
bmi.biSize = sizeof(BITMAPINFOHEADER);
bmi.biPlanes = 1;
bmi.biBitCount = 24;
bmi.biWidth = ScreenXResolution;
bmi.biHeight = -ScreenYResolution;
bmi.biCompression = BI_RGB;
SelectObject(hdcMem, hBitmap);
BitBlt(hdcMem, 0, 0, ScreenXResolution, ScreenYResolution, hdc, 0, 0, SRCCOPY);
GetDIBits(hdc, hBitmap, 0, ScreenYResolution, screenData, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
DeleteObject(hBitmap);
DeleteDC(hdcMem);
ReleaseDC(NULL, hdc);
}

我想要实现的是截取他们的屏幕截图并将其放入 screenData。

我之所以需要它,是因为我可以在任何位置检查它是否是某种 RGB 颜色,但我在这样做时遇到了问题。

如果有人能帮助我,我将不胜感激。

谢谢!

编辑:添加了内存分配,我尝试获取 RGB 的方法是通过一个返回 colorref 的函数,如下所示:

COLORREF getRGBFromScreenshot(BYTE *screenshot, int x, int y)
{
return RGB(screenshot[3 * ((y * ScreenXResolution) + x) + 2], screenshot[3 * ((y * ScreenXResolution) + x) + 1], screenshot[3 * ((y * ScreenXResolution) + x)]);
}

最佳答案

你有一个,也许是两个问题。

首先是将参数作为指针的地址传递,即 BYTE **。但是,您只能将它用作单个指针。这意味着当您调用 GetDIBits 时,它将填入错误的地址。编译器应该对此发出警告。

第二个问题更有可能,因为可能有代码您没有显示,但您从未初始化 screenData 指针。您似乎没有分配内存来将位图数据复制到其中。

以上两个问题都会导致未定义的行为,这可能有时看起来工作但不正确,或者随时可能崩溃。


至于指针问题,指针正如它的名字所说:它指向某物。对于您的 screenData 指针,它可以像这样可视化:

+------------+      +---------------------------------+| screenData | ---> | Memory allocated for screenData |+------------+      +---------------------------------+

但是,当您在对 captureScreenshot 的调用中使用地址运算符 & 时,您正在创建一个指向 screenData 的新指针变量:

+-------------+      +------------+      +---------------------------------+| &screenData | ---> | screenData | ---> | Memory allocated for screenData |+-------------+      +------------+      +---------------------------------+

从上面简单的“图片”中,很容易看出为什么使用&screenData 不起作用,它只是指向一个完全不同的内存位置。

关于c - 字节数组有问题/捕获屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15724999/

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