Форум программистов, компьютерный форум CyberForum.ru

Visual C++

Войти
Регистрация
Восстановить пароль
 
Xavie
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 7
#1

Координаты пикселей в Bitmap - Visual C++

06.01.2017, 02:49. Просмотров 294. Ответов 2
Метки нет (Все метки)

Данный код чекает пиксели в определённом квадрате (размере) и если есть чёрный цвет пикселя, то выполняет действие. Я не могу понять как тут считается координаты квадрата, как я понял, он идёт из центра в правый нижний гол размером 30х30 и в нём ищет цвет. Как сделать что-бы координаты квадрата были ровно по центру размером 30х30 ? И второй пример по точным заданным координатам X,Y ?

Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
HDC hdc = NULL;
HDC hdcTemp = NULL;
HWND hWndGame = NULL;
RECT rect = { 0 };
BYTE* bitPointer;
int x, y;
int red, green, blue;
 
bool zClass::GoPixel()
{
    while (1)
    {
        Sleep(5);
 
        int MAX_WIDTH = 30;
        int MAX_HEIGHT = 30;
        HWND window = GetDesktopWindow();
        RECT windowRect;
        HDC winDC = GetWindowDC(window);
        HDC bmpDC = CreateCompatibleDC(winDC);
        BITMAPINFO info;
        BITMAPINFOHEADER &bmpInfoHeader = info.bmiHeader;
        BITMAP* pBitmap;
        bmpInfoHeader.biSize = sizeof(bmpInfoHeader);
        bmpInfoHeader.biWidth = MAX_WIDTH;
        bmpInfoHeader.biHeight = MAX_HEIGHT;
        bmpInfoHeader.biPlanes = 1;
        bmpInfoHeader.biBitCount = 32;
        bmpInfoHeader.biCompression = BI_RGB;
        bmpInfoHeader.biSizeImage = bmpInfoHeader.biWidth*bmpInfoHeader.biHeight*(bmpInfoHeader.biBitCount / 8);
        bmpInfoHeader.biXPelsPerMeter = 0;
        bmpInfoHeader.biYPelsPerMeter = 0;
        bmpInfoHeader.biClrUsed = 0;
        bmpInfoHeader.biClrImportant = 0;
        BYTE* bitPointer;
        HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&bitPointer, NULL, 0);
        SelectObject(bmpDC, bitmap);
        BitBlt(bmpDC, 0, 0, MAX_WIDTH, MAX_HEIGHT, winDC, 960, 540, SRCCOPY);
        ReleaseDC(window, winDC);
 
        for (int y = 0; y < MAX_HEIGHT; y++) for (int x = 0; x < MAX_WIDTH; x++)
        {
            BYTE* ppoint = &bitPointer[4 * (MAX_WIDTH*(MAX_HEIGHT - 1 - y) + x)];
            red = (int)ppoint[2];
            green = (int)ppoint[1];
            blue = (int)ppoint[0];
 
            if (red == 0 && green == 0 && blue == 0)
            {
                cout << "Your color found" << endl;
            }
            //else
                //cout << "Not your color" << endl;
 
        }
    }
    return false;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2017, 02:49     Координаты пикселей в Bitmap
Посмотрите здесь:

Перебор пикселей - Visual C++
Есть ли в Gdi+ способ быстро перебрать все пиксели картинки? Этот способ из библиотеки OpenCV и он очень быстрый, потому что инфа о...

Правильное отображение пикселей - Visual C++
Соль: Создаю окно размером 100 на 100 пикселей, используя функцию HWND hWnd = CreateWindow( L&quot;D3D Tutorial&quot;, L&quot;D3D Tutorial 02:...

BITMAP - Visual C++
Каким образом можно работать с BITMAP с помощью WinAPI????? Т.е. мне нужно создать 2d массив из цветов пикселей BITMAP-а После кода:...

Тормозит Bitmap - Visual C++
1) при создание нового экземпляра класса bitmap используется не тот конструктор, тоесть: Я пише: Bitmap bmp(membit,(HPALETTE...

VC++ SDI Bitmap - Visual C++
Мне нужен кусок кода, чтобы поместить bitmap из файла в клиентскую область SDI.

Bitmap из ресурсов.. - Visual C++
Правильно ли я загружаю Bitmap из ресурсов Folder = LoadBitmap(0, &quot;IDB_BITMAP1&quot;);

Загрузка изображения Bitmap - Visual C++
Здравствуйте. Можно ли загружать два и более изображения в один объект, или все таки под каждое изображение нужно делать свой объект?

Получить bitmap картинку с камеры - Visual C++
Скажите пожалуйста, как получить всего одну картинку с веб-камеры. Интересует именно минимальный, конкретный и переносимый код, возможно...

Как поместить на кнопку bitmap? - Visual C++
Я конечно понимаю что вопрос детский! Но я только пытаюсь разобраться с с++. Поэтому приведите плиз куочек кода с реализацией. Как...

Неувязка с искажениями вывода в окно и перерисовкой bitmap - Visual C++
Здравствуйте, Неувязка в том, что в Visual Studio C++ 2013 windows API проекте (игра) В debug-окне (F5) все работает ОК, но при запуске...

Bitmap с фоновым цветом диалогового окна (как сделать?) - Visual C++
Будьте добры, подскажите незнающему: как вставить в диалоговое окно bitmap с прозрачным фоном? Точнее, чтобы фон автоматически не менялся...

Координаты окна - Visual C++
Существует такая задача: нужно чтобы левый верхний угол диалогового окна при вызове располагался в координатах (0,0)... Подскажите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rao
852 / 405 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
06.01.2017, 12:00     Координаты пикселей в Bitmap #2
Что бы просто проверить пикселы не нужно их никуда копировать. Можно же их проверять прямо в том контексте где они уже есть. Вот пример по заданным координатам (125, 150):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    HWND window = ::GetDesktopWindow();
    HDC winDC = ::GetWindowDC(window);
 
    int MAX_WIDTH = 30;
    int MAX_HEIGHT = 30;
 
    int iStartPosX = 125;       // <- начальная координата X 
    int iStartPosY = 150;       // <- начальная координата Y
 
    COLORREF rgbCurrentPixel = 0;
 
    for (int y = 0; y < MAX_HEIGHT; y++) 
    {
        for (int x = 0; x < MAX_WIDTH; x++)
        {
            rgbCurrentPixel = GetPixel(winDC, iStartPosX + x, iStartPosY + y);
            if ( GetRValue(rgbCurrentPixel) == 0 && 
                 GetGValue(rgbCurrentPixel) == 0 && 
                 GetBValue(rgbCurrentPixel) == 0 )
            {
                // черный пиксел нашелся
            }
        }
    }
::ReleaseDC(window, winDC);
А для того, что бы сделать выборку по центру надо получить размер окна (GetClientRect(...)), вычесть ширину квадрата (MAX_WIDTH) и разделить пополам, это будет начальная координата X. Сделать так же с высотой и будет начальная координата Y. Дальше все как в примере выше.
Xavie
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 7
06.01.2017, 16:06  [ТС]     Координаты пикселей в Bitmap #3
Спасибо, за пример, правда.
Но мне нужно с помощью копирования в буфер и от туда уже, т.к работает быстрее, чем с GetPixel.
Yandex
Объявления
06.01.2017, 16:06     Координаты пикселей в Bitmap
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru