Рисование прозрачной плоскости с отверстиями в GDI+

Мне нужно нарисовать прозрачную плоскость над пользовательским элементом управления в моем приложении DotNET 2.0. По крайней мере, это легко. Сложность в том, что мне нужны некоторые (потенциально перекрывающиеся) отверстия в этой плоскости. Форма и размер отверстий неизвестны во время компиляции.

Я попытался подойти к этому с помощью Region и исключить из него кучу GraphicPaths. Это прекрасно работает, за исключением того, что края отверстий не сглаживаются.

Любые другие решения?

Имейте в виду, что пользовательский элемент управления является основной частью окна, которое можно развернуть. Таким образом, он имеет потенциально очень большую площадь поверхности. Решение должно быть достаточно быстрым, чтобы дать мне не менее 10 кадров в секунду в полноэкранном режиме.

Изменить: добавлено изображение того, чего я хотел бы достичь: http://en.wiki.mcneel.com/content/upload/images/HolesInTPlane.png


person David Rutten    schedule 14.09.2009    source источник


Ответы (1)


Это способ сделать это: (хотя это звучит не быстро, он использует чистые блит-функции, поэтому потенциально он может быть достаточно быстрым)

  1. Создайте закадровое растровое изображение размером с ваше окно. (вам нужно сделать это только один раз, вы можете сохранить его для последующих красок)
  2. Залейте его сплошным цветом.
  3. Вырезанные отверстия в закадровом растровом изображении с определенным цветом (например, фиолетовым)
  4. поместите все растровое изображение в свое окно, наполовину непрозрачное и с фиолетовым цветом в качестве цветового ключа. (поэтому фиолетовый не копируется).
person Toad    schedule 14.09.2009
comment
Рейньер, использование одного цвета для цветового ключа не даст мне прозрачности, но идея заслуживает внимания. Я могу создать закадровое изображение с альфа-каналом и наложить его. Это будет не так быстро, как битовая операция, но все же может быть достаточно быстрым. Спасибо. - person David Rutten; 14.09.2009
comment
привет, я все еще убежден, что colorkey работает. Это типичный способ блитирования графики с дырками (как спрайты в видеоиграх). Остальная часть изображения, не имеющая цветового ключа, полупрозрачна. Не путем установки альфы в закадровом изображении, а путем переопределения альфа-компонента в блике. В любом случае, дайте мне знать, как продвигаются дела - person Toad; 15.09.2009
comment
Я вообще отказался от этого подхода. Я пробовал около 10 различных алгоритмов, и единственный, который выглядел хорошо, требовал от меня постобработки каждого пикселя во вложенном цикле. Даже с небезопасным прямым доступом к пикселям C# он оказался слишком медленным. Я прибегал к объединению форм отверстий перед рисованием, чтобы избавиться от всех перекрытий. Тем не менее, еще раз спасибо за усилия, очень признателен. - person David Rutten; 17.09.2009