83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 145
|
|
1 | |
Как реализовать свой постоянный кастомный цветовой фильтр на монитор?22.07.2020, 13:16. Показов 2044. Ответов 9
Метки нет (Все метки)
Можно ли средствами WPF или UWP наложить свой постоянный кастомный цветовой фильтр на монитор?
Монитор показывает некие изображения. Каждый пиксель, передает цвет+освещенность, как 3-байтную информацию в системе RGB. Имеет значение по каждому из цветов, от 0 (освещенности нет) до 255 - максимальная освещенность по одному из цветов. Как именно преобразовывать эти пиксели чтобы получился цветовой фильтр - не главное (будет свой алгоритм, принимающий входной RGB, и выдающий RGB после преобразования). Ну допустим, совсем по-простому - фильтр будет таким - уменьшить значение G, т.е. зеленого - на -20 , зато если красные и синие имеют значение меньше 200, то увеличиваем их на +30. просто для всего экрана Windows. (наша программа на WPF может при этом вообще не иметь своего окна, будет только виден процесс если посмотреть в Task Manager). Также, как нам нужно изменять не только статические изображения, например картинку bmp , тоже не главное. Вопрос в том, как такую программу, запустить, чтобы на экране постоянно, и во все моменты времени, этот фильтр применялся? Т.е. вот допустим, запустил фильм, видео, и все кадры измененные, т.е. смотришь видео с этим цветовым фильтром. Добавлено через 6 минут Дополню - для экрана операционной системы Windows. Как я себе это представляю. В Win API есть функции - получить данные в системе RGB пикселя по координатам, от какого нибудь окна, зная дескриптор этого окна. Если в функцию в параметр дескриптора окна - передать 0, то получим данные пикселя всего экрана Windows. Т.е. если координаты будут 0,0 , получим данные самого верхнего и левого пикселя. Наверное, такая же возможность есть и в WPF, прочитать пиксели всего экрана или окна какого нибудь стороннего приложения. Как сделать Layered-окно ? 1) читаем пиксели всего экрана Windows. 2) если они покрываются окном нашей программы - изменяем их , согласно нашему алгоритму. 3) ядро Windows видит, что у экрана, вообще то другие пиксели, но оно перекрывается окном приложения, и в месте где находится окно, выводит измененные согласно нашему алгоритму, пиксели. Так, получили цветовой фильтр - окно нашей формы выводит то, что было бы на экране без окна + изменные согласно алгоритму цветового фильтра, пиксели. Может даже, такое окно, наложенное поверх видео-плеера, показывающего фильм, и фильм хорошо покажет, с измененными цветами, (а не только статические изображения). Но вопрос то в том, что если наложить такое "окно" поверх всего экрана, то на экране ничего не сделаешь. Т.к. клик мышкой допустим, по какому то значку на рабочем столе - результат - ОС Windows посчитает что клик произошел не по экрану, а по окну приложения, и значит, ничего не произойдёт , того что должно было произойти в ответ на этот клик. Я хочу цветовой фильтр на монитор, со всеми возможностями, как будто этого цветового фильтра и не было бы, значит, менять пиксели надо для самого экрана Windows. При этом, наша программа на WPF может вообще не иметь окна, в привычном его понимании, это будет просто как некий процесс, который можно увидеть в Task Manager. Но не имея окна, она будет изменять цвета экрана Windows. Таким образом , что может делать программа? 1) прочитать пиксели всего экрана Windows, и их же изменить по какому то алгоритму. Это значит что посредством функций WPF , мы лезем в видеопамять, и что то там меняем. Что в видеопамяти находится , то экран нам и покажет. Так, статическое изображение программа может и изменить. Но в случае динамически сменяющегося изображения (например смотрим фильм), в эту видео-память, записываются кадры, т.е. по сути 1) видеодрайвер сам что то постоянно пишет в видеопамять и её изменяет, и 2) одновременно с этим видеодрайвером, наша программа будет лезть в эту же видео-память, и тоже что то менять. Если это не синхронизировать, то возможно, увидим некое "мерцающее изображение", вместо обычного , с наложенным цветовым фильтром. Т.е. в какие то времена, будем видеть изображение оригинальное, записанное видеодрайвером, в какие то времена - будем видеть изображение записанное нашей программой. Так, вопрос, как это синхронизировать?
0
|
22.07.2020, 13:16 | |
Ответы с готовыми решениями:
9
Можно ли средствами C++ и Win API наложить свой постоянный кастомный цветовой фильтр на монитор? Как реализовать цветовой круг? А как вы моете свой монитор? Почему OnMouseMove плохо реагирует на перемещение курсора. Как можно реализовать постоянный опрос getCursorPos |
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
22.07.2020, 14:26 | 2 |
Можно попробовать пробрасывать виндовые сообщения под окно.
Ну что-то типа Код
SendMessage(GetDesktopWindow(),WM_LBUTTONDOWN,MK_LBUTTON,MAKELONG(pt.x,pt.y))
1
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 145
|
||||||
22.07.2020, 14:38 [ТС] | 3 | |||||
SatanaXIII , спасибо.
Как оказалось , вот что нужно. (средствами C++ и Win API уже нашел как сделать. Интересно только, можно ли подобное сделать средствами WPF или UWP) Создал проект, RGBfilter - название проекта - программа. В MS Visual Studio 2017 (хотя и в более старых отработает. Главное чтобы Windows 2000 или более поздней версии была). Создаём проект, C++ консольное приложение(по умолчанию выводит строку "Hello, world!"). Вот код-пример программы, просто снижает яркость всех зеленых пикселей, отчего имзменяются все другие цвета. По коду можно понять, как менять RGB для всех пикселей экрана, и вообще накладывать любые кастомные фильтры. Допустим, пользователю не нравится стантартные цвета от Windows. Можно также, с помощью фильтров выдавать изображение таким как видят его дихроматы ("посмотри на экран, посмотри фильм глазами дальтоника" и т.д.)
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
23.07.2020, 11:11 | 4 |
SergeyYN, ну тут сразу нескромный вопрос - зачем WPF, если можно взять C++?
Второй момент: возьмите приложение, написанное на C++, оформите его как библиотеку и в WPF-приложении просто используйте эту библиотеку. Ну или вообще вариант номер три: в WPF-приложении использовать прям WinAPI.
1
|
17685 / 12871 / 3365
Регистрация: 17.09.2011
Сообщений: 21,136
|
|
23.07.2020, 11:33 | 5 |
На гитхабе есть разновидность f.lux (рекомендую, кстати), написанная на шарпе/WPF — гляньте исходники, может чем-то вдохновитесь.
1
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 145
|
|
23.07.2020, 15:40 [ТС] | 6 |
И всё таки по тому способу , который выше приводил (используя SetDeviceGammaRamp), невозможно делать любой полноценный цветовой преобразователь. (под словом "фильтр" можно понимать, как любое преобразование цветов).
Дело вот в чём. Информацию по пикселю в системе RGB : (x, y, z), числа x, y, z (отвечают за яркость красного, зеленого и синего соответственно) , используя SetDeviceGammaRamp, можно изменять только независимо друг от друга. Например RGB : (0, 50, 0) --> (0, 150, 0) (0, 100, 0) --> (0, 40, 0) значит что зеленый цвет с освещенностью 50 - всегда посветлеет до 150, (а 100 - наоборот потемнеет до 40) - независимо от данных по другим цветам. В полноценно-функциональном цветовом преобразователе, такая зависимость может быть. Допустим, я хочу настроить фильтр-преобразователь так, чтобы зелёные превращались в красные (той же освещенности). Вот футбол смотрим например, чтобы трава на поле футбольном поле выглядела красной. RGB : (0, 50, 0) --> (50, 0, 0) (0, 100, 0) --> (100, 0, 0) Здесь, в зависимости от того, что в числе G, зелёный, данные по красному 0 - могут превратиться как в 50, так и в 100. Для таких, всевозможных вариантов, и матрица-преобразования, должна иметь размер WORD GammaArray[256][256][256]; а не WORD GammaArray[3][256]; что в действительности принимает метод SetDeviceGammaRamp. Это очевидно, если посчитать число всех возможных комбинаций преобразующих пиксель. Значит, такой метод всё же , не подходит, надо делать каким то другим способом. Интуитивно кажется, что тут или 1) должен быть добавлен некая программа-слой между видеодрайвером и видеопамятью (чтобы то, что видеодрайвер пытается записать в видеопамять, проходило через эту матрицу-преобразователь), 2) или надо вмешаться в работу самого видеодрайвера (писать программу задействующую GPU). Можно ли это сделать посредством C++ и Win API ? Или C# WPF ? Хотя бы, в какую сторону думать (Direct2D, или т.п.) ? Если посредством C++ и Win API , Или C# и WPF нельзя это сделать, может быть, тему правильнее создать в разделах, где обсуждается именно программирование под GPU ? Спасибо. Добавлено через 19 минут Если интересно, какие цели задачи. Если я напишу это программу, то там будет опция - преобразовать цвета под тританопию, протанопию, и т.д. У меня будет 7 вариантов цветовых преобразователей, можно выбрать любой, и каждый преобразователь будет изменять цвета на мониторе , в точности так, как оригинальные цвета видят дальтоники (7-ми типов дальтонизма). (Статическую картинку то легко преобразовать - берём bmp-файл, и обрабатываем каждый пиксель согласно алгоритму. ) А на лету через такой фильтр всё пропускать - это другое, более сложное, аналогичных программ не встречал, и так можно и любые фильмы смотреть "глазами дальтоника". Такая вот задача, и кстати, достаточно интересная, и с практическим применением . Наконец, кому то просто могут и не нравится "Стандартные цвета Windows", и можно будет настроить "на свой вкус" . Добавлено через 2 минуты Добавлено через 1 час 4 минуты Совсем по простому --------------> Нужно написать программу, которая после запуска, просто на мониторе - 1) меняет все цвета красные на зелёные (аналогичной освещенности), 2) меняет все цвета зелёные на красные (аналогичной освещенности). Т.е. например, все пиксели должны превратиться в видеопамяти RGB такие (0, 50, 0) --> в (50, 0, 0) . При этом, монитор Windows продолжает работать как ни в чём не бывало, можно смотреть фильмы с измененными цветами и т.д. Это самое простое описание, чтобы понимать от чего двигаться. Если это сделать, то можно будет делать и более сложные цветовые преобразователи.
0
|
Элд Хасп
|
||||||
23.07.2020, 19:25
#7
|
||||||
1
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 145
|
|
23.07.2020, 21:10 [ТС] | 8 |
Элд Хасп , спасибо.
Если такую задачу можно решить , посредством 1) C++ Win API (и Direct2D), 2) а с помощью WPF это сделать нельзя, это значит, что возможности у первого - больше, у последнего - меньше. Разочарование от WPF , я думал, что система помощнее, с бОльшими возможностями. А тут , и фильтр-преобразователь цвета на весь монитор не сделать..
0
|
Модератор
|
|
23.07.2020, 22:28 | 9 |
SergeyYN, не совсем так.
С++ - это язык программирования. Занимает промежуточное положение между низкоуровневыми и высокоуровневневыми языками. По этой причине, одной из широко используемой областью его применения, является работа с "железом". На С++ для работы с OC в основном используется API. Платформа Net появилась значительно позже широкого распространения С++. Язык C# появился уже значительно позже и, фактически, он является частью Net. А платформа Net накладывает ограничения на работу с ОС. Хотя на C# и можно работать с API, но это не типично для C# и редко применяется. Инструменты построения GUI (Формы, WPF, UWP и др.) - это уже совсем "другая песня". Они представляют из себя просто библиотеки различных UI-контролов и UI-элементов. Никаких средств для работы с железом или напрямую с ОС в них нет. Это им просто не нужно. Сравнивать что "мощнее".... Что мощнее "600-й мерс" или "внедорожный байк"? Они не лучше/хуже - они просто разные. Попробуйте создать хороший, современный GUI на С++. Это возможно, но потребует много времени и усилий, там где WPF справится "на раз, два".
0
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 145
|
|
23.07.2020, 23:07 [ТС] | 10 |
Ясно, спасибо. Значит тут для моей задачи, лучшее средство - C++ .
Я уже даже начинаю представлять, как это делать (хотя бы , в какую сторону думать).
0
|
23.07.2020, 23:07 | |
23.07.2020, 23:07 | |
Помогаю со студенческими работами здесь
10
Как реализовать фильтр гаусса Как реализовать фильтр на форме не по LIKE? Как реализовать фильтр поиска? Как реализовать среднеарифметический фильтр Подскажите, как реализовать фильтр дубликатов Как реализовать фильтр интернет адресов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |