Рисование «прозрачного» текста с помощью C # Graphics, но таким образом, чтобы нарисованный текст был «отсутствующим», чтобы он был прозрачным в полученном изображении - PullRequest
2 голосов
/ 26 мая 2011

Я хочу нарисовать строку на DC (Графика - я использую C #) - но я хочу, чтобы нарисованный текст был «удален» из изображения, так что то, что осталось, по сути является вырезкой из текста.

Если бы я был на DrawString с прозрачной кистью, очевидно, ничего бы не случилось.

Есть ли способ нарисовать что-то подобное или мне нужно использовать 2 DC и BitBlt с некоторой комбинацией NOT или XOR или чего-то еще (я делал подобные вещи много лет назад, но мне было интересно, есть ли более простой способ)?

Ответы [ 4 ]

3 голосов
/ 14 ноября 2011

Если вы хотите вырезать что-то из изображения, вы можете сделать это так:

Drawing2D.GraphicsContainer c = graphics.BeginContainer();
GraphicsPath p = new GraphicsPath();

p.AddString(...);

graphics.SetClip(p, CombineMode.Xor);
graphics.DrawImage(this.Image, this.Location);

graphics.EndContainer(c);

Это похоже на решение выше, но сначала без SetClip объект Graphics не обновляется, а во-вторых, вам нужно использовать Xor.

Обратите внимание, что создание GraphicsContainer необязательно, но упрощает инкапсуляцию, особенно если вы работаете с преобразованиями.

2 голосов
/ 26 мая 2011

Возможно, вы захотите попробовать:

// g is your Graphics object
using (var path = new GraphicsPath())
{
    path.AddString(.... );
    g.Clip.Exclude(path);
}
// Do your other painting here

Звучит так, как будто это может потребовать от вас создать новое изображение и нарисовать старое сверху. Хотя я не уверен в твоей ситуации.

0 голосов
/ 19 августа 2011

Вы можете установить Graphics.CompositingMode на CompositingMode.SourceCopy - но я не уверен, будет ли это работать с прозрачным контентом.

Способ обойти это:

  1. Нарисуйте текст на отдельном изображении красной кистью на черном фоне.
  2. Перебирайте каждый пиксель текстового изображения и целевого изображения ...
  3. ... вручную устанавливайте альфа-значение цвета пикселя целевого изображениясогласно текстовому изображению Красный компонент.

Если скорость не имеет значения, и вы имеете дело с небольшими растровыми изображениями, вы можете использовать методы GetPixel и SetPixel.Но я бы рекомендовал использовать LockBits для прямого доступа к BitmapData и обработки пикселей в байтовом массиве.Это быстрое и не сложное в реализации решение, хотя вам придется иметь дело с «небезопасным» кодом (или использовать класс Marshal).

Ссылка LockBits на MSDN

Ссылка маршала на MSDN

0 голосов
/ 26 мая 2011

Из быстрого поиска, к сожалению, не похоже, что System.Drawing поддерживает отрисовку XOR, и вам нужно использовать неуправляемые вызовы GDI +. Этот ответ на аналогичный вопрос ссылается на страницу, которая может объяснить, как это сделать - интересный файл здесь .

Надеюсь, это поможет.

...