Итак, я ищу способ прочитать цвет пикселя экрана в коде C.
Я уже нашел реализацию в C для * nix (которая использует библиотеку X11/Xlib, которая, как я понял, только для систем * nix), и я пробовал код на машине linux, и он работал довольно быстро (он читает 8K пикселей за 1 секунду).
Вот код в C, что я нашел и раздвоенный:C - как читать цвет пикселя экрана (FAST)? (в Windows)
#include <X11/Xlib.h>
void get_pixel_color (Display *d, int x, int y, XColor *color)
{
XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
color->pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), color);
}
// Your code
XColor c;
get_pixel_color (display, 30, 40, &c);
printf ("%d %d %d\n", c.red, c.green, c.blue);
И я искал аналогичное решение для Windows, а также.
я наткнулся на этот код (я поставил код о чтении экранный пиксель в «для» петли):
FARPROC pGetPixel;
HINSTANCE _hGDI = LoadLibrary("gdi32.dll");
if(_hGDI)
{
pGetPixel = GetProcAddress(_hGDI, "GetPixel");
HDC _hdc = GetDC(NULL);
if(_hdc)
{
int i;
int _red;
int _green;
int _blue;
COLORREF _color;
ReleaseDC(NULL, _hdc);
for (i=0;i<8000;i++)
{
_color = (*pGetPixel) (_hdc, 30 ,40);
_red = GetRValue(_color);
_green = GetGValue(_color);
_blue = GetBValue(_color);
}
ReleaseDC(NULL, _hdc);
printf("Red: %d, Green: %d, Blue: %d", _red, _green, _blue);
}
FreeLibrary(_hGDI);
(с использованием gdi32.dll и windows.h ...)
и тому «для» части кода (где мы читаем 8K пикселей) работает ALOT медленнее, чем решение в C. , для завершения по сравнению с 1 секундой для X11/Xlib.h требуется 15 секунд!
Итак, как я могу сделать это лучше? или есть ли какая-нибудь другая лучшая реализация FASTER для чтения пиксельных цветов с помощью кода C на компьютере с Windows?
Спасибо заранее!
Hmya, пропускная способность 32KB/sec не так много, чтобы хвастаться. Windows требует, чтобы программисты были более умными читателями, книга Петцольда хорошо объясняет BitBlt(). –
Сколько пикселей вы пытаетесь прочитать здесь? Всего 1, или вы собираетесь проверять целую кучу? Если целая группа, getPixel, вероятно, не способ сделать это, а не то, что захватывает весь экран текстуры сразу. –
Да, я пытаюсь читать кучу ... Как я показал, решение * nix может читать много пикселей за 1 секунду, в то время как решение для Windows очень медленное ... Любые предложения, другие решения или ресурсы? Я искал лучшее решение в Windows некоторое время, и я просто не мог его найти. – Matan