223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
1

Пиксель экрана

01.03.2014, 23:51. Показов 7776. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
а можно написать код, который смог бы сделать так, чтобы определенный пиксель экрана был, скажем, зеленого цвета? идеи сделать его битым не принимаются
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2014, 23:51
Ответы с готовыми решениями:

Проверка закрашен ли пиксель
Необходимо приобразовать черно-белую картинку в массив, каждый черный пиксель в массиве 1 каждый...

Как на SDL 2 нарисовать пиксель?
Делаю урок, но он для SDL 1.2, а во второй версии нету функции SDL_SetVideoMode(), и хоть я создаю...

Как ложно выводить на монитор битый пиксель?
Здравствуйте!!! Сам я чайник ещё в программировании, но задался таким вопросом, с целью узнать,...

Что-то не так с OpenGL или головой, ошибка в один пиксель
Отрисовываю точку и прямоугольник в старой версии OpenGL через GLFW - прямоугольник получается ниже...

18
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:52 2
Можно.
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
01.03.2014, 23:53  [ТС] 3
а как???
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
01.03.2014, 23:58 4
Лучший ответ Сообщение было отмечено mat_for_c как решение

Решение

Ладно... Смотри

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
char szClassName[ ] = "WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT |
           WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW,
           szClassName,
           "",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             SetPixel (hPaintDC, 100, 100, RGB (0, 255, 0));
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 3 минуты
Можно конечно проще, но тогда после обновления экрана сотрется.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <windows.h>
 
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
     hDC = GetDC (0);
     SetPixel (hDC, 100, 100, RGB (0, 255, 0));
     ReleaseDC (0, hDC);
}
1
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.03.2014, 00:02  [ТС] 5
FreeMan108, пишет, что не может char* перевести в LPCWSTR

C++
1
wincl.lpszClassName = szClassName;
Добавлено через 1 минуту
C++
1
hDC = GetDC (0);
какой тип то указывать?
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:07 6
Ах да UNICODE
Исправь

C++
1
wchar_t szClassName[ ] = L"WindowsApp";
И в CreateWindow тоже перед кавычками поставь L

Добавлено через 3 минуты
Тип

C++
1
HDC hDC = GetDC (0);
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.03.2014, 00:17  [ТС] 7
а сколько она по времени то работает?
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:23 8
Она все время работает
Надо через диспетчер задач останавливать

Добавлено через 3 минуты
Вот лучше вариант

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#define WINVER 0x0500
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH hBrush;
    HGDIOBJ hOld;
    
        HDC hPaintDC;
        PAINTSTRUCT ps;
    switch (message)
    {
        case WM_CREATE:
            hBrush = CreateSolidBrush (RGB (0, 255, 0));
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hOld = SelectObject (hPaintDC, hBrush);
             Ellipse (hPaintDC, 100, 100, 200, 200);
             SelectObject (hPaintDC, hOld);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
            DeleteObject (hBrush);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
02.03.2014, 00:26 9
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:43 10
Цитата Сообщение от programina Посмотреть сообщение
FreeMan108, а можно мне тоже зеленый пиксель? Только мне нужно не 1, а 90000 зеленых пикселей отдаленных друг от друга на 1-3 пикселя по всему экрану. Сможете?
Зеленый пиксель конечно можно, но из-за их количества уж наверное лучше иметь готовую картинку (bmp) с нужной сеткой. Так эффективнее.

Примерно то, что нужно.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#define WINVER 0x0500
#define UNICODE
#define _UNICODE
#include <windows.h>
 
#define ID_TIMER_UP 100
 
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
 
wchar_t szClassName[ ] = L"WindowsApp";
HINSTANCE hInst;
int cxScreen, cyScreen;
 
int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)
 
{
    HWND hwnd;
    MSG msg;
    WNDCLASSEX wincl;
 
    wincl.hInstance = hInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WndProc;
    wincl.style = CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW;
    wincl.cbSize = sizeof (WNDCLASSEX);
 
    wincl.hIcon = LoadIcon (NULL, IDI_HAND);
    wincl.hIconSm = LoadIcon (NULL, IDI_HAND);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
 
    wincl.hbrBackground = (HBRUSH) CreateSolidBrush (RGB (255,0,255));
 
    if (!RegisterClassEx (&wincl))
        return 0;
    
    hInst = hInstance;
    cxScreen = GetSystemMetrics (SM_CXSCREEN);
    cyScreen = GetSystemMetrics (SM_CYSCREEN);
 
    hwnd = CreateWindowEx (
           WS_EX_LAYERED | WS_EX_TOPMOST | WS_EX_TRANSPARENT
           //| WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW
           ,
           szClassName,
           L"",
           WS_POPUP,
           0,
           0,
           cxScreen,
           cyScreen,
           HWND_DESKTOP,
           NULL,
           hInstance,
           NULL
           );
    SetTimer (hwnd, ID_TIMER_UP, 100, NULL);
    SetLayeredWindowAttributes (hwnd, RGB (255,0,255), 255, LWA_ALPHA | LWA_COLORKEY);
 
    ShowWindow (hwnd, nFunsterStil);
 
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    KillTimer (hwnd, ID_TIMER_UP);
    
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        static HBITMAP hScreen;
        static BITMAP bmpScreen;
        
        static HBRUSH hClassBrush;
        
        static RECT rcWnd;
        
        HDC hPaintDC, hDC, hMemDC;
        PAINTSTRUCT ps;
        HGDIOBJ hOld;
        
    switch (message)
    {
        case WM_CREATE:
             GetWindowRect (hwnd, &rcWnd);
             
             hClassBrush = (HBRUSH)GetClassLong (hwnd, GCL_HBRBACKGROUND);
             
             hDC = CreateIC (L"DISPLAY", NULL, NULL, NULL);
             hScreen = CreateCompatibleBitmap (hDC, cxScreen, cyScreen);
             hMemDC = CreateCompatibleDC (hDC);
             hOld = SelectObject (hMemDC, hScreen);
             FillRect (hMemDC, &rcWnd, (HBRUSH)hClassBrush);
             for (int x = 0; x < cxScreen; x+=3)
                for (int y = 0; y < cyScreen; y+=3)
                    SetPixel (hMemDC, x, y, RGB (0, 255, 0));
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             DeleteDC (hDC);
             
             GetObject (hScreen, sizeof (BITMAP), &bmpScreen);
             break;
        case WM_PAINT:
             hPaintDC = BeginPaint (hwnd, &ps);
             hMemDC = CreateCompatibleDC (hPaintDC);
             hOld = SelectObject (hMemDC, hScreen);
             
             BitBlt (
             hPaintDC,
             0, 0,
             bmpScreen.bmWidth, bmpScreen.bmHeight,
             hMemDC,
             0, 0,
             SRCCOPY );
             
             SelectObject (hMemDC, hOld);
             DeleteDC (hMemDC);
             EndPaint (hwnd, &ps);
             break;
        case WM_TIMER:
             switch (wParam)
             {
                    case ID_TIMER_UP:
                         SetWindowPos (hwnd, HWND_TOP, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
                         break;
                    }
             break;
        case WM_DESTROY:
             DeleteObject (hScreen);
             DeleteObject ( (HGDIOBJ)SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)GetStockObject (WHITE_BRUSH)) );
            PostQuitMessage (0);
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam);
    }
 
    return 0;
}
2
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
02.03.2014, 00:46  [ТС] 11
а вот чтоб в игре его было видно можно так сделать?
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 00:52 12
Этот пиксель будет видно в играх, но не во всех. Причиной тому является то, что некоторые игры делают так называемый "захват экрана", а чтобы туда еще свой пиксель припаять нужен прямой доступ к видеопамяти, а это уже надо какими-то фокусами делать.
1
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 00:58 13
Это делается обычно через Overlay видеокарты. Надо DirectX ковырять. У самого мечта подобным образом логи вывести. Фишка оверлея в том, что в видеопамять изображение не загружается, а формируется непосредственно перед конвертированием в сигнал на монитор, но ПОСЛЕ формирования стандартного вывода. Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.

Добавлено через 2 минуты
Кстати точно тот же самый процесс использует OverlayMixer в плеерах.
1
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 01:08 14
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Т.е. вы в прямом смысле накладываете поверх выходного изображения свое, какое пожелаете.
Вот если бы еще где-то примерчик глянуть.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 01:36 15
Сам искал когда-то... Мне кидали пример... для делфика... Это на рабочий стол пламя выводит кажется.

Добавлено через 17 минут
Тьфу. А ссылку то не вставил. http://file.qip.ru/arch/Z4e0Z0... nfire.html
0
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 13:57 16
Вот только примерчик не рабочий
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 17:30 17
Другого нет, извиняйте. Попробуйте поискать в сторону OverlayMixer видео вывода. Вообще насколько знаю пример рабочий и оно работало...
Посмотрите еще тут статейку. Вроде неплохая.
http://www.delphimaster.ru/articles/directx/
1
121 / 121 / 32
Регистрация: 04.03.2013
Сообщений: 370
02.03.2014, 18:48 18
Спасибо за все. Буду разбираться.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
02.03.2014, 21:09 19
Если разберетесь, пожалуйста, отпишитесь. Для меня очень интересная идея, но сам пока не вывезу.
0
02.03.2014, 21:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.03.2014, 21:09
Помогаю со студенческими работами здесь

Проверить, попал ли пиксель RGB-цвета в диапазон нужных цветов
Есть программа, которая смотрит в координаты и сверяет цвет пикселя в этих координатах с диапазон...

Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана находиться буква «О»
Написать игру. В верхней части экрана летят 3 «звездочки»(***). В нижнем правом углу экрана...

Найти в указанном регионе экрана пиксель нужного цвета
Судя по названию темы задача думаю понятна. Я попробовал реализовать решение, используя библиотеку...

Каким стандартным софтом Windows можно смотреть пиксель в пиксель?
Здравствуйте. Есть изображение - дизайн сайта. Можно ли каким встроенным стандартным софтом...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru