图纸;透明的;文本通过C#图形,但其方式将绘制的文本转换为;“失踪”;所以它';它在结果图像中是透明的

图纸;透明的;文本通过C#图形,但其方式将绘制的文本转换为;“失踪”;所以它';它在结果图像中是透明的,c#,graphics,gdi+,transparency,drawstring,C#,Graphics,Gdi+,Transparency,Drawstring,我希望在DC上绘制一个字符串(图形-我使用的是C#)),但我希望从图像中“删除”绘制的文本,以便剩下的基本上是文本的剪切 如果我用透明的刷子拉绳子,显然什么都不会发生 有没有一种方法可以画出这样的东西,或者我需要使用2个DC和BitBlt,再加上一些NOT或XOR之类的组合(我几年前做过类似的事情,但想知道是否有一种更简单的方法)?通过快速搜索,很遗憾它看起来不像系统。绘图支持XOR绘图,您需要使用对GDI+的非托管调用。对于一个类似的问题,可以链接到一个页面,该页面可能会解释如何做到这一点——

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

如果我用透明的刷子拉绳子,显然什么都不会发生


有没有一种方法可以画出这样的东西,或者我需要使用2个DC和BitBlt,再加上一些NOT或XOR之类的组合(我几年前做过类似的事情,但想知道是否有一种更简单的方法)?

通过快速搜索,很遗憾它看起来不像系统。绘图支持XOR绘图,您需要使用对GDI+的非托管调用。对于一个类似的问题,可以链接到一个页面,该页面可能会解释如何做到这一点——有趣的文件是

希望这能有所帮助。

您可能希望尝试:

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

听起来这可能需要你制作一个新的图像并在上面画一个旧的。不过,我不确定您的情况。

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

解决方法是:

  • 在黑色背景上使用红色笔刷将文本绘制到单独的图像
  • 迭代文本图像和目标图像的每个像素
  • …根据文本的图像红色分量手动设置目标图像像素颜色的Alpha值
  • 如果速度不是一个问题,并且处理小位图,则可以使用
    GetPixel
    SetPixel
    方法。但我建议使用
    LockBits
    直接访问
    BitmapData
    并处理字节数组中的像素。虽然您必须处理“不安全”代码(或使用
    Marshal
    类),但这是一种快速且不难实现的解决方案


    如果你想从图像中剪切出什么,你可以这样做:

    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,图形对象不会得到更新,其次,需要使用Xor


    请注意,制作GraphicsContainer是可选的,但会使封装更容易,尤其是在处理转换时。

    谢谢。。我放弃了这个特别的爱好。。。我开始做“获取像素”解决方案,但这并不值得。