0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 3
1

C++ GDI+ bitamap.getpixel

16.03.2023, 23:50. Показов 502. Ответов 2
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, пытаюсь получить цвет пикселя на изображении рабочего стола.
GetPixel постоянно выдает нулевые значения. Смотрел документацию на сайте микрософта.
Подскажите почему GetPixel выдает ошибку.
Взял кусок кода с сайта о GDI+
Сохраняю изображение в Bitmap оно сохраняется адекватно.

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
#include <iostream>
#include <Windows.h>
using namespace std;
 
#include <gdiplus.h>
 
#pragma comment(lib, "GdiPlus.lib")
using namespace Gdiplus;
Color clr;
void CreateGDIplus();
 
int main()
{
 
    CreateGDIplus();
    return 0;
}
 
static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
 
 
void CreateGDIplus()
{
    Sleep(1000);
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    HDC scrdc, memdc;
    HBITMAP membit;
    // Получаем HDC рабочего стола
    // Параметр HWND для рабочего стола всегда равен нулю.
    scrdc = GetDC(0);
    // Определяем разрешение экрана
    int Height, Width;
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width = GetSystemMetrics(SM_CXSCREEN);
    // Создаем новый DC, идентичный десктоповскому и битмап размером с экран.
    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);
    // Улыбаемся... Снято!
    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap;
    hBitmap = (HBITMAP)SelectObject(memdc, membit);
    Gdiplus::Bitmap bitmap(hBitmap, NULL);
    
    if (bitmap.GetPixel(Height / 2, Width / 2, &clr))
        cout << "GetPixel == Ok" << endl;
    else
        cout << "GetPixel == Error" << endl;
    bitmap.Save(L"D:\\screen2.png", &png);
    DeleteObject(hBitmap);
    cout << "Screen Ready" << endl;
    //GdiplusShutdown(gdiplusToken);
}
0
Лучшие ответы (1)
16.03.2023, 23:50
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.03.2023, 23:50
Ответы с готовыми решениями:

Выбор между GDI / GDI+ / CreateWindow
Приветствую. У меня накопилось несколько вопросов и я был бы очень рад получить на них ответ. Я хочу создать программу-виджет которая...

Одновременное использование GDI / GDI+
Добрый день. Был всегда убежденным Дельфистом, но решил попробовать силы в написании проги на С++, для чего попробовать адаптировать...

GetPixel
Всем доброго времени суток. Столкнулся со странной проблемой. Вот код который на xp работал как часы, попробовал под win7 и он выдаёт...

2
Эксперт С++
 Аватар для schdub
3072 / 1410 / 425
Регистрация: 19.01.2009
Сообщений: 3,890
17.03.2023, 23:56 2
Лучший ответ Сообщение было отмечено Mardok как решение

Решение

Mardok, у вас в консоль выводится GetPixel == Error?
Дело в том, что метод Bitmap::GetPixel возвращает не boolean значение (как у вас предполагается в коде), а перечисляемый тип Status, успешное значение в котором равно 0 (Ok = 0, GenericError = 1, ...).
1
0 / 0 / 0
Регистрация: 16.03.2023
Сообщений: 3
18.03.2023, 10:04  [ТС] 3
Большое спасибо, я только вчера об этом подумал, но не стал проверять это. Буду пробовать иные варианты проверки.

Добавлено через 15 минут
Цитата Сообщение от schdub Посмотреть сообщение
Mardok, у вас в консоль выводится GetPixel == Error?
Дело в том, что метод Bitmap::GetPixel возвращает не boolean значение (как у вас предполагается в коде), а перечисляемый тип Status, успешное значение в котором равно 0 (Ok = 0, GenericError = 1, ...).
Как вы и сказали, я не правильно расценивал ответ GetPixel.
Убрал условия и начал выводить полученные значения, как минимум GetValue выдает положительный ответ.
Спасибо!
0
18.03.2023, 10:04
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2023, 10:04
Помогаю со студенческими работами здесь

GetPixel
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;stdlib.h&gt; #include &lt;tchar.h&gt; using namespace std; int _tmain(int argc,...

GetPixel() и SetWindowText()
Здравствуйте. Например во Flash и Javascript есть инструменты(функции) для отладки(trace(),console.log()) где можно увидеть значение...

GetPixel(), BitMap()
Всем привет! Столкнулся с проблемой, что &quot;GetPixel()&quot; работает медленно на Windows 7 и выше, если стоит стиль оформления...

Извлечение информации из GetPixel()
Для извлечения информации о каждом пикселе выбранной мной картинки использую следующий метод: CImage image; image.GetPixel(j,i); ...

[WinApi] Аналог GetPixel
можете подскзать аналог GetPixel он слишком много тормозит или как можна сделать в моем случае: У меня есть лабиринт шарик бегает...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Пользуясь нейросетью возвращаюсь к вопросу альтернативных приводов поступательного движения.
Hrethgir 14.02.2025
Описание тут https:/ / habr. com/ ru/ articles/ 778118/ . Вопрос ответ You Привет. Скажи, есть-ли вещества, которые могут менять жидкое состояние на желеобразное под воздействием ультразвука? . . .
Ошибка "Another git process seems to be running in this repository"
hw_wired 14.02.2025
При работе с git можно столкнуться с довольно раздражающей ошибкой "Another git process seems to be running in this repository". Эта ситуация возникает, когда система контроля версий пытается. . .
Ошибка "java.lang.NoCl­assDefFou­ndErro­r: javax/xml/bind/JAXBException"
hw_wired 14.02.2025
Как разработчики Java-приложений, мы сталкиваемся с разными ошибками, но одна из них - java. lang. NoClassDefFoundError: javax/ xml/ bind/ JAXBException - стала особенно актуальной после выхода Java 9. . . .
Отличия for-in от for-of в JavaScript
hw_wired 14.02.2025
Когда-то единственным способом перебора элементов массива или свойств объекта был классический цикл for с счетчиком. Да, он отлично справлялся с задачей, но код получался громоздким и не очень. . .
Отличия implementation, api и compile в Gradle
hw_wired 14.02.2025
Управление зависимостями - одна из ключевых задач при разработке современных приложений на Java и Kotlin. Система сборки Gradle предоставляет гибкие и мощные средства для работы с зависимостями,. . .
Что лучше: require или import/export в JavaScript
hw_wired 14.02.2025
Модульность в JavaScript прошла долгий путь эволюции, и сегодня у разработчиков есть два основных способа организации модулей: старый добрый require из системы CommonJS и современные import/ export из. . .
Ошибка "Uncaught SyntaxError: Cannot use import statement outside a module"
hw_wired 14.02.2025
Думаю, многие разработчики сталкивались с ошибкой "Uncaught SyntaxError: Cannot use import statement outside a module" при попытке использовать современный синтаксис импорта в JavaScript. Эта. . .
Ошибка Docker "Got permission denied while trying to connect to the Docker daemon socket at"
hw_wired 14.02.2025
Разработка с использованием Docker может иногда преподносить неожиданные сюрпризы, и одним из самых распространенных камней преткновения становится ошибка с отказом в доступе к демону Docker. . . .
Ошибка "No 'Access-Control-Allow-Origin' header is present on the requested resource"
hw_wired 14.02.2025
При разработке современных веб-приложений нередко сталкиваешься с ошибкой "No 'Access-Control-Allow-Origin' header is present on the requested resource". Эта проблема возникает из-за политики. . .
Как закрыть порт в Linux
hw_wired 14.02.2025
Управление сетевыми портами в Linux - непростая, но важная задача для обеспечения безопасности системы. Каждый открытый порт - это потенциальная уязвимость, через которую злоумышленики могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru