3

我希望在 DC 上绘制一个字符串(图形 - 我正在使用 C#) - 但我希望从图像中“删除”绘制的文本,以便剩下的基本上是文本的剪切。

如果我用透明画笔来拉绳,显然什么都不会发生。

有没有一种方法来绘制类似的东西,或者我是否需要使用 2 个 DC 和 BitBlt 以及 NOTs 或 XOR 的某种组合(我几年前做过类似的事情,但想知道是否有更简单的方法)?

4

4 回答 4

3

如果你想从图像中删除某物,你可以这样做:

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 是可选的,但会使封装更容易,尤其是在使用转换时。

于 2011-11-14T14:07:42.533 回答
2

您可能想尝试:

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

听起来像这样可能需要您制作新图像并将旧图像绘制在顶部。不过我不确定你的情况。

于 2011-05-26T02:24:29.403 回答
0

通过快速搜索,不幸的是 System.Drawing 不支持 XOR 绘图,您需要使用对 GDI+ 的非托管调用。这个对类似问题的回答链接到一个可能解释如何做到这一点的页面 - 有趣的文件在这里

希望这可以帮助。

于 2011-05-26T01:03:32.093 回答
0

您可以设置Graphics.CompositingModeCompositingMode.SourceCopy- 但我不确定这是否适用于透明内容。

解决这个问题的方法是:

  1. 使用黑色背景上的红色画笔将文本绘制到单独的图像上。
  2. 迭代文本图像和目标图像的每个像素...
  3. ...根据文本的图像红色分量手动设置目标图像像素颜色的Alpha值。

如果速度不是问题并且您处理小位图,您可以使用GetPixelSetPixel方法。但我建议使用直接LockBits访问BitmapData和处理字节数组中的像素。这是一个快速且不那么难以实现的解决方案,尽管您必须处理“不安全”代码(或使用Marshal类)。

MSDN 上的 LockBits 参考

MSDN 上的元帅参考

于 2011-08-19T08:17:33.620 回答