通过C#Graphics绘制“透明”文本,但是它将绘制的文本变为“缺失”,因此它在结果图像中是透明的

时间:2011-05-26 00:23:06

标签: c# graphics gdi+ transparency drawstring

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

如果我用透明刷子绘制DrawString,显然什么都不会发生。

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

4 个答案:

答案 0 :(得分: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是可选的,但使封装更容易,特别是如果你使用变换。

答案 1 :(得分:2)

您可能想尝试:

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

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

答案 2 :(得分:0)

从快速搜索来看,它看起来不像System.Drawing支持XOR绘图,你需要使用非托管调用GDI +。 This answer类似的问题链接到可能解释如何执行此操作的页面 - 有趣的文件是here

希望这有帮助。

答案 3 :(得分:0)

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

解决这个问题的方法是:

  1. 使用黑色背景上的红色画笔将文本绘制为单独的图像。
  2. 迭代文本图像和目标图像的每个像素......
  3. ...根据文本图像红色组件手动设置目标图像像素颜色的Alpha值。
  4. 如果速度不是问题而您处理小位图,则可以使用GetPixelSetPixel方法。但我建议使用LockBits直接访问BitmapData并处理字节数组中的像素。这是一个快速且不那么难以实现的解决方案,尽管您必须处理“不安全”代码(或使用Marshal类)。

    LockBits reference on MSDN

    Marshal reference on MSDN