我希望在DC上绘制一个字符串(图形 - 我正在使用C#) - 但我希望从图像中“删除”绘制的文本,这样剩下的就是文本的剪切。
如果我用透明刷子绘制DrawString,显然什么都不会发生。
有没有办法绘制类似的东西,或者我是否需要使用2个DC和BitBlt以及NOT或XOR或其他任何组合(我几年前做过类似的事情,但是想知道是否有一种简单的方法)?
答案 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
- 但我不确定这是否适用于透明内容。
解决这个问题的方法是:
如果速度不是问题而您处理小位图,则可以使用GetPixel
和SetPixel
方法。但我建议使用LockBits
直接访问BitmapData
并处理字节数组中的像素。这是一个快速且不那么难以实现的解决方案,尽管您必须处理“不安全”代码(或使用Marshal
类)。