цветовая фильтрация экрана - PullRequest
0 голосов
/ 17 сентября 2010

Я хочу создать фильтр для определенной области экрана для выполнения операций фильтрации.

Примеры того, что может быть операция фильтрации:
- инвертирование (например, изменение черного пикселя на белые пиксели, красныйна голубой)
- маскирующие пиксели (например, mask = ff0000; ввод c79001 -> c70000)
- такие операции, как эффекты слоя в Photoshop

Вот пример того, как это должно выглядеть: http://img443.imageshack.us/img443/1462/overlayk.png

Кто-нибудь знает, как это сделать под ОС Windows.(мой любимый язык - C #)

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2010

Чтобы уточнить: вы хотите, чтобы область рабочего стола, а не только в пределах вашего окна, находилась под вашим контролем, позволяя вам применять фильтр для каждого пикселя.Если это так, я думаю, что вам нужен DirectDraw с использованием библиотек XNA.WPF МОЖЕТ получить то, что вам нужно, а WinForms, скорее всего, не получит.Также существуют сторонние инструменты.

Если вы хотите эту возможность только в пределах окна вашего приложения, например, в приложении для рисования, это становится намного проще.Каждый класс в пространстве имен Windows.Forms, который наследуется от Control, предоставляет метод CreateGraphics ().Этот метод возвращает объект, представляющий поверхность рисования, покрывающую область экрана элемента управления, и является основой для всего, что вы хотите сделать в окне, включающем пользовательскую графику (и внутренне он используется для рисования элементов управления в первую очередь).

Когда у вас есть объект Graphics, вы можете рисовать на нем изображения.Популярный метод рисования пользовательской графики, такой как анимация или игры, состоит в том, чтобы фактически рисовать объект Bitmap (полученный из абстрактного изображения), а затем, когда вы закончите, нарисуйте Bitmap в области Graphics.Это сделано, чтобы уменьшить мерцание;если графическая область отображается пользователю во время ее рисования, пользователь увидит полное изображение только за доли секунды, прежде чем оно будет «стерто» и перерисовано, а фигуры, нарисованные на полпути, будут там один раз и исчезнут.затем, когда они ждут, чтобы их нарисовали.Рисование растрового изображения, а затем отображение растрового изображения на экране, когда вы закончите, означает, что пользователь видит полное изображение за один раз.

Вы можете расширить это, используя функции прозрачности для создания многослойных изображений.Иметь растровое изображение для каждого слоя, которым вы хотите манипулировать.Работайте с ними по отдельности, затем нарисуйте каждый из них в правильном порядке от начала до конца на главном растровом изображении и нарисуйте это растровое изображение на экране.Это позволяет вам использовать те операции типа PhotoShop, когда часть изображения представляет собой один слой, и им можно манипулировать независимо от всех остальных.

Что касается фильтрации по пикселям, объекты Bitmap предоставляют функции GetPixel () и SetPixel ().методы, которые позволяют вам захватить цвет одного пикселя, выполнить расчет фильтра и заново нарисовать его.Этот процесс будет полностью ускорен и поэтому будет ограничен скоростью вашего процессора, но позволит очень точно управлять вашим изображением или повторять такие задачи, как ваши фильтры.

0 голосов
/ 17 сентября 2010

В зависимости от того, насколько быстро вам нужен «фильтр» для обновления, быстрый и хакерский способ - просто сделать скриншот с помощью CopyFromScreen, когда окно фильтра невидимо, применить фильтр к данным изображения, а затем установить окно фильтрадля отображения данных изображения.

Если вы хотите сделать это без необходимости сначала скрывать окно, вам, вероятно, потребуется выполнить что-то вроде http://www.codeproject.com/KB/system/snapshot.aspx, где вы снимаете отдельные окна.

Еще более хитрая, но потенциально более быстрая вещь, требующая почти полного использования вызовов p / invoke win32, заключалась бы в том, чтобы вообще не иметь окна, получать необходимые окна захвата на основе их координат, захватывать изображения, как указано выше., а затем рисовать прямо на экране DC.

...