Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 7

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

06.01.2017, 02:49. Показов 2791. Ответов 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;
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.01.2017, 02:49
Ответы с готовыми решениями:

Как создать bitmap из области (по координатам пикселей) другого bitmap
Здравствуйте. Подскажите пожалуйста как создать bitmap из области(по координатам пикселей) другого bitmap. Вообщем обрезать.

Изменение пикселей Bitmap
Хочу написать программу с эффектом &quot;выцветания&quot; картинки, но написанный мною алгоритм вводит компьютер в фазу глубоко раздумья надолго,...

Увеличение Bitmap до пикселей
Как увеличить bitmap так чтоб при максимальном увеличении 1 пиксель ровнялся 32! если bitmap 4000 x 4000 то умножением это будет...

2
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
06.01.2017, 12:00
Лучший ответ Сообщение было отмечено Xavie как решение

Решение

Что бы просто проверить пикселы не нужно их никуда копировать. Можно же их проверять прямо в том контексте где они уже есть. Вот пример по заданным координатам (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. Дальше все как в примере выше.
1
0 / 0 / 0
Регистрация: 06.01.2017
Сообщений: 7
06.01.2017, 16:06  [ТС]
Спасибо, за пример, правда.
Но мне нужно с помощью копирования в буфер и от туда уже, т.к работает быстрее, чем с GetPixel.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.01.2017, 16:06
Помогаю со студенческими работами здесь

Определение цвета пикселей в разных Bitmap
image = Image.FromFile(bmpPath); image = Image.FromFile(bmpPath); int width = image.Width; int...

Bitmap. SetPixel окрашивает несколько пикселей вместо 1
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using...

Как установить новый цвет пикселей (Bitmap)
Хочу задать новые цвета пикселям изображения и сохранить картинку с новыми цветами, но не знаю как правильно это сделать. Проблема в этой...

Координаты пикселей и цвет
Привет, есть изображение, два двухмерных массива, массива типа int и string. Начиная с верхнего левого угла изображения, записать...

Преобразование пикселей изображения в координаты
Здравствуйте уважаемые коллеги. Столкнулся с проблемой которую не могу решить. Необходимо найти координаты каждого пикселя изображения...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru