Получение цвета пикселя в C++

Я хотел бы получить значения RGB пикселя в разных координатах x, y на экране. Как бы я это сделал на С++?

Я пытаюсь создать свой собственный эффект размытия по Гауссу.

Это будет в Windows 7.

Изменить

Какие библиотеки должны быть включены, чтобы это работало?

Что я собираюсь:

#include <iostream>

using namespace std ;

int main(){

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

    cout << color; 

}

person rectangletangle    schedule 29.01.2011    source источник
comment
Не хватает информации. Можете ли вы объяснить, почему вы хотите это сделать? Кроме того, это, безусловно, зависит от ОС.   -  person Björn Pollex    schedule 30.01.2011
comment
Извините за это, я добавил больше информации.   -  person rectangletangle    schedule 30.01.2011


Ответы (2)


Как упоминалось в предыдущем сообщении, вам нужен GetPixel из Win32 API.

GetPixel находится внутри gdi32.dll, поэтому, если у вас есть правильная настройка среды, вы сможете включить windows.h (который включает wingdi.h), и вы должны быть золотыми.

Если у вас по какой-либо причине настроена минимальная среда, вы также можете напрямую использовать LoadLibrary для gdi32.dll.

Первый параметр GetPixel — это дескриптор контекста устройства, который можно получить, вызвав функцию GetDC (которая также доступна через <windows.h>).

Базовый пример, который загружает GetPixel из dll и распечатывает цвет пикселя в текущей позиции курсора, выглядит следующим образом.

#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;
}
person syllogism    schedule 30.01.2011
comment
Обратите внимание, что если вы хотите сделать это для более чем нескольких пикселей, GetPixel будет очень медленно. Быстрый способ — создать совместимый DC, создать и выбрать в нем DIBSection, а затем получить прямой доступ к памяти, поддерживающей его пиксели. - person Matteo Italia; 10.07.2017

Вы можете использовать GetDC в окне NULL, чтобы получить контекст устройства для всего экрана, а затем вызвать GetPixel:

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

Конечно, вы хотели бы получать и освобождать контекст устройства только один раз, выполняя все считывание пикселей для эффективности.

person templatetypedef    schedule 29.01.2011
comment
@ Anteater7171- Если вы #include <windows.h> этого должно быть достаточно, при условии, что вы строите из Visual Studio. Я использовал этот трюк много лет назад, не делая ничего особенного, кроме этого. - person templatetypedef; 30.01.2011
comment
@ Anteater7171- Извините, я ничего не знаю об этом компиляторе и ничем не могу вам помочь. Вы, вероятно, захотите связать некоторые из системных файлов DLL, таких как gdi32.lib, и, возможно, стоит поискать в MSDN, какие конкретные библиотеки требуются. - person templatetypedef; 30.01.2011