所以,我有一个视频源,这是我进入图像的快照,抓住一个图形对象,然后在图像的右下角绘制一个时间戳。 迄今没问题。 但是,我不能保证什么颜色将是后面的文字,所以不管我用什么刷,它几乎肯定会用一些,它是绘制在图像的交锋,使文字难以阅读。
我想知道是否有人知道的一种方式(无论是在.NET的方法,还是一个不错的算法),用于确定基于其背后的图像上的字符串的最佳色彩。
干杯
所以,我有一个视频源,这是我进入图像的快照,抓住一个图形对象,然后在图像的右下角绘制一个时间戳。 迄今没问题。 但是,我不能保证什么颜色将是后面的文字,所以不管我用什么刷,它几乎肯定会用一些,它是绘制在图像的交锋,使文字难以阅读。
我想知道是否有人知道的一种方式(无论是在.NET的方法,还是一个不错的算法),用于确定基于其背后的图像上的字符串的最佳色彩。
干杯
just draw the string 5 times.
One time 1(or2) pixels to the left in black
One time 1(or2) pixels to the right in black
One time 1(or2) pixels above it in black
One time 1(or2) pixels below it in black
and the final time in white on the place where you want it
唯一可靠的方法是使用对比的轮廓。
早在中64代子画面图形的日子里,如果你想要的东西站出来反对任何背景,则使用XOR位图传输。 有人提到这是“反向视频”。
你可以画线用这种方式ControlPaint.DrawReversibleLine
,但不会对文字工作。
这CodeProject上的文章显示了如何使用互操作来创建一个XOR刷gdi32.dll
。
或者,如果它是允许的,你可以使用文本(例如,白色文本黑色背景),背景色(你的选择)。
否则,你就需要捕获其中的文字写入(每帧)的矩形, 创建它的负面形象 ,然后拿到位数在矩形的颜色,并用它来写的文字。
一个更复杂的解决方案将让你使用两层(初始图片 - L1和文本(透明背景,黑色文本) - L2),并结合他们之前,采取一切从L2包含文本的像素和改变颜色为每个文本至“负面”底层像素颜色L1的值的像素,但你不会得到的东西太有用从“观察者”的观点。
这可能是一个数量上的变化由reinier答案 。
对于最后一个选项的一些例子,看看幻灯片18和21在高级OSM制图在SlideShare上。
下面的代码片段展示了如何反转的颜色(背景),然后应用黛娜的建议创建使用Graphics.DrawString()的背景。
private static Color InvertColor(Color c)
{
return Color.FromArgb(255 - c.R, 255 - c.G, 255 - c.B);
}
// In the following, constants and inplace vars can be parameters in your code
const byte ALPHA = 192;
var textColor = Color.Orange;
var textBrush = new SolidBrush(Color.FromArgb(ALPHA, textColor));
var textBrushBkg = new SolidBrush(Color.FromArgb(ALPHA, InvertColor(textColor)));
var font = new Font("Tahoma", 7);
var info = "whatever you wanna write";
var r = new Rectangle(10, 10, 10, 10);
// write the text
using (var g = Graphics.FromImage(yourBitmap))
{
g.Clear(Color.Transparent);
// to avoid bleeding of transparent color, must use SingleBitPerPixelGridFit
g.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
// Draw background for text
g.DrawString(info, font, textBrushBkg, r.Left - 1, r.Top - 1);
g.DrawString(info, font, textBrushBkg, r.Left + 1, r.Top + 1);
g.DrawString(info, font, textBrushBkg, r.Left + 1, r.Top - 1);
g.DrawString(info, font, textBrushBkg, r.Left - 1, r.Top + 1);
// Draw text
g.DrawString(info, font, textBrush, r.Left, r.Top);
}