绘图“;透明的“;通过C#图形的文本,但在某种程度上它将绘制的文本变成“文本”;缺少“;所以它';s在生成的图像中
本文关键字:文本 缺少 图像 图形 通过 透明 绘制 绘图 在某种程度上 | 更新日期: 2023-09-27 17:57:37
我想在DC上绘制一个字符串(Graphics-我使用的是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,图形对象不会更新,其次,您需要使用Xor。
请注意,制作GraphicsContain是可选的,但会使封装更容易,尤其是在处理转换时。
您可能想要尝试:
// 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
,但我不确定这是否适用于透明内容。
解决方法是:
- 在黑色背景上用红色画笔将文本绘制成单独的图像
- 在文本图像和目标图像的每个像素上迭代
- 。。。根据文本的图像"红色"分量手动设置目标图像像素颜色的"Alpha"值
如果速度不是问题,并且处理小位图,则可以使用GetPixel
和SetPixel
方法。但我建议使用LockBits
直接访问BitmapData
,并处理字节数组中的像素。这是一个快速且不难实现的解决方案,尽管您将不得不处理"不安全"的代码(或使用Marshal
类)。
MSDN 上的LockBits参考
MSDN 上的Marshal引用
很遗憾,从快速搜索来看,它不像System.Drawing支持XOR绘图,您需要使用对GDI+的非托管调用。这个类似问题的答案链接到一个页面,可以解释如何做到这一点——有趣的文件在这里。
希望这能有所帮助。