Показать фильтр С#

Немного сложно объяснить, что мне нужно, но я попробую:

Мне нужно написать приложение (winform), которое будет своего рода фильтром для изображения/других форм позади него. За одним исключением - вся задняя форма должна выглядеть как есть кроме красного (например) цвета, который нужно заменить на любой другой заданный цвет, например белый.

Итак, давайте представим, что я открыл Windows Word с несколькими строками текста. С красными и черными буквами. Поэтому, когда я размещаю свое приложение над этим текстом, оно должно «фильтровать» красные символы и заливать их белым.

Итак, как я понимаю эту задачу: я должен привязать область за формой, затем обработать ее (заменить цвета) и после этого нарисовать это изображение на моем теле формы.

Любые ссылки или ключевые слова для решения?

УПД:

Итак, это мое окончательное решение:

  1. сделать форму прозрачной (используя свойства TransparencyKey и BackColor)
  2. поместить изображение поверх формы
  3. когда нам нужно обновить изображение в picturebox - мы заменяем текущее изображение на pictureBox1.Image = null;, затем обновляем форму с помощью (this.Refresh()) и делаем новый снимок

Спасибо за все ;-)

UPD 2: http://dl.dropbox.com/u/4486681/result.png

UPD 3: вот исходники


person zerkms    schedule 02.03.2010    source источник
comment
+1 - Я думаю, что это отличный вопрос.   -  person Kyle Rosendo    schedule 02.03.2010
comment
Должен ли это быть winforms? Я подозреваю, что такие вещи могут быть проще в WPF.   -  person Gabe    schedule 02.03.2010
comment
без ограничений и обязательных условий. это должно быть приложение Windows .net с любой формой (по крайней мере, с заголовком и кнопкой закрытия) ;-)   -  person zerkms    schedule 02.03.2010


Ответы (2)


вы можете создать снимок рабочего стола, используя следующий код:

public Bitmap CaptureScreen()
{
    Bitmap b = new Bitmap(SystemInformation.VirtualScreen.Width, SystemInformation.VirtualScreen.Height);
    Graphics g = Graphics.FromImage(b);
    g.CopyFromScreen(0, 0, 0, 0, b.Size);
    g.Dispose();
    return b;
}

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

Обратите внимание, что из-за таких настроек, как ClearType и других механизмов сглаживания, вы также должны учитывать «промежуточные пиксели» при замене цвета. Иначе все будет выглядеть смешно :-)

person Thorsten Dittmar    schedule 02.03.2010
comment
да, я уже думал о близких цветах. это будет следующей проблемой ;-) так что - может ли кто-нибудь предложить лучшее решение? - person zerkms; 02.03.2010
comment
Здорово ! Я не знал метода CopyFromScreen, именно поэтому я думал, что @zerkms должен прибегнуть к C++ - person Timores; 02.03.2010

Я не знаю, можно ли это сделать вообще (посмотрим, что ответят другие :-).

Вы можете получить дескриптор контекста экранного устройства, который дает вам растровое изображение экрана.

HDC DC = GetDC (NULL);

(Это С++, вам придется использовать P/Invoke или создать библиотеку смешанного режима на С++)

Затем вы можете перерисовать область экрана с помощью процесса фильтрации.

Теперь начинаются проблемы:

  • как узнать, что пиксели в интересующей вас области изменились?
  • если область изменяется, видны ли изменения или они скрыты вашим собственным рисунком.

У вас может быть кнопка, которая на мгновение скрывает ваше собственное приложение и показывает его при повторном нажатии, а также фильтрует новый контент.

Удачи. Есть ли возможность поделиться пользовательским сценарием?

person Timores    schedule 02.03.2010
comment
в моем случае - пиксели за приложением будут статичными, это упростит мое решение. (надеюсь, я смогу это сделать %), поэтому radrawing будет необходим только в одном случае: мое приложение было перемещено или мое приложение вернуло фокус после того, как потеряло его. - person zerkms; 02.03.2010
comment
Это хорошее упрощение. Я думаю, что решение @Thorsten лучше (без С++). - person Timores; 02.03.2010