在C++中获取像素颜色

9

我想获取屏幕上不同x、y坐标处像素的RGB值。 我该如何在C++中做到这一点?

我正在尝试创建自己的高斯模糊效果。

这将在Windows 7中完成。

编辑

需要包含哪些库才能运行?

我已经开始了:

#include <iostream>

using namespace std ;

int main(){

    HDC dc = GetDC(NULL);
    COLORREF color = GetPixel(dc, 0, 0);
    ReleaseDC(NULL, dc);

    cout << color; 

}

1
信息不足。你能解释一下为什么要这样做吗?此外,这肯定是特定于操作系统的。 - Björn Pollex
抱歉,我添加了更多信息。 - rectangletangle
2个回答

15

您可以在NULL窗口上使用GetDC获取整个屏幕的设备上下文,并可以跟进调用GetPixel

HDC dc = GetDC(NULL);
COLORREF color = GetPixel(dc, x, y);
ReleaseDC(NULL, dc);

当然,为了提高效率,在进行所有像素读取时,您只需要获取和释放设备上下文一次。


@Anteater7171- 如果你在Visual Studio中构建,只要包含#include <windows.h>就足够了。我很多年前就用过这个技巧,除此之外没有做任何特殊的事情。 - templatetypedef
@Anteater7171- 抱歉,我对那个编译器一无所知,无法提供太多帮助。你可能需要链接一些系统 DLL 文件,例如 gdi32.lib,并且最好在 MSDN 上查找所需的特定库。 - templatetypedef

10

如先前的帖子所述,您需要从Win32 API中获取GetPixel函数。

GetPixel位于gdi32.dll内部,因此如果您已经正确设置了环境,您应该可以包含windows.h(它包括wingdi.h)并且一切都应该很好。

如果由于某种原因您只有最小的环境设置,您也可以直接在gdi32.dll上使用LoadLibrary。

GetPixel的第一个参数是设备上下文句柄,可通过调用GetDC函数(也可以通过<windows.h>获得)来检索。

以下是打印当前光标位置像素颜色的基本示例,其中加载了来自dll的GetPixel:

#include<windows.h>
#include<stdio.h>

typedef WINAPI COLORREF (*GETPIXEL)(HDC, int, int);

int main(int argc, char** argv)
{

    HINSTANCE _hGDI = LoadLibrary("gdi32.dll");
    if(_hGDI)
    {
        while(true) {
            GETPIXEL pGetPixel = (GETPIXEL)GetProcAddress(_hGDI, "GetPixel");
            HDC _hdc = GetDC(NULL);
            if(_hdc)
            {
                POINT _cursor;
                GetCursorPos(&_cursor);
                COLORREF _color = (*pGetPixel) (_hdc, _cursor.x, _cursor.y);
                int _red = GetRValue(_color);
                int _green = GetGValue(_color);
                int _blue = GetBValue(_color);

                printf("Red: 0x%02x\n", _red);
                printf("Green: 0x%02x\n", _green);
                printf("Blue: 0x%02x\n", _blue);
            }
            FreeLibrary(_hGDI);
        }
    }
    return 0;
}

1
请注意,如果要针对多个像素执行此操作,则“GetPixel”速度非常慢。快速的方法是创建一个兼容的DC,在其中创建并选择一个DIBSection,然后直接访问支持其像素的内存。 - Matteo Italia
乍一看,似乎有以下几点需要改进:1)while循环的定位(原始答案中没有)可以进一步优化;2)在这种情况下需要调用ReleaseDC,因为它是“常规DC”(参见此处);3)为什么这个答案与其他答案不同?- 看起来提问者选择了这个答案,因为常规方法(如其他答案)对他/她无效,并且似乎提问者已经删除了在其他答案中的评论。 - starriet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接