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

C++ GDI+ bitamap.getpixel

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

Студворк — интернет-сервис помощи студентам
Приветствую, пытаюсь получить цвет пикселя на изображении рабочего стола.
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)
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
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
17.03.2023, 23:56
Лучший ответ Сообщение было отмечено 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  [ТС]
Большое спасибо, я только вчера об этом подумал, но не стал проверять это. Буду пробовать иные варианты проверки.

Добавлено через 15 минут
Цитата Сообщение от schdub Посмотреть сообщение
Mardok, у вас в консоль выводится GetPixel == Error?
Дело в том, что метод Bitmap::GetPixel возвращает не boolean значение (как у вас предполагается в коде), а перечисляемый тип Status, успешное значение в котором равно 0 (Ok = 0, GenericError = 1, ...).
Как вы и сказали, я не правильно расценивал ответ GetPixel.
Убрал условия и начал выводить полученные значения, как минимум GetValue выдает положительный ответ.
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru