我希望在 DC 上绘制一个字符串(图形 - 我正在使用 C#) - 但我希望从图像中“删除”绘制的文本,以便剩下的基本上是文本的剪切。
如果我用透明画笔来拉绳,显然什么都不会发生。
有没有一种方法来绘制类似的东西,或者我是否需要使用 2 个 DC 和 BitBlt 以及 NOTs 或 XOR 的某种组合(我几年前做过类似的事情,但想知道是否有更简单的方法)?
我希望在 DC 上绘制一个字符串(图形 - 我正在使用 C#) - 但我希望从图像中“删除”绘制的文本,以便剩下的基本上是文本的剪切。
如果我用透明画笔来拉绳,显然什么都不会发生。
有没有一种方法来绘制类似的东西,或者我是否需要使用 2 个 DC 和 BitBlt 以及 NOTs 或 XOR 的某种组合(我几年前做过类似的事情,但想知道是否有更简单的方法)?
如果你想从图像中删除某物,你可以这样做:
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-Object 不会得到更新,其次,您需要使用 Xor。
请注意,制作 GraphicsContainer 是可选的,但会使封装更容易,尤其是在使用转换时。
您可能想尝试:
// g is your Graphics object
using (var path = new GraphicsPath())
{
path.AddString(.... );
g.Clip.Exclude(path);
}
// Do your other painting here
听起来像这样可能需要您制作新图像并将旧图像绘制在顶部。不过我不确定你的情况。
您可以设置Graphics.CompositingMode
为CompositingMode.SourceCopy
- 但我不确定这是否适用于透明内容。
解决这个问题的方法是:
如果速度不是问题并且您处理小位图,您可以使用GetPixel
和SetPixel
方法。但我建议使用直接LockBits
访问BitmapData
和处理字节数组中的像素。这是一个快速且不那么难以实现的解决方案,尽管您必须处理“不安全”代码(或使用Marshal
类)。