所以,我有一个视频源的快照,我进入一个Image,为它抓取一个Graphics对象,然后在图像的右下角绘制一个时间戳。到目前为止没问题。但是,我不能保证文本后面会有什么颜色,所以不管我使用什么画笔,它几乎肯定会与它所绘制的一些图像发生冲突,使文本不可读。
我想知道是否有人知道某种方式(在.net中的方法,或者是一个不错的算法),以确定基于其背后图像的字符串的最佳颜色。
干杯
答案 0 :(得分:7)
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
答案 1 :(得分:2)
唯一可靠的方法是使用对比轮廓。
答案 2 :(得分:1)
回到Commodore 64精灵图形的时代,如果你想在任何背景下突出一些东西,你就使用了XOR blitting。有人将此称为“反向视频”。
您可以使用ControlPaint.DrawReversibleLine
以这种方式绘制线条,但这不适用于文字。
此CodeProject article显示了如何使用gdi32.dll
的互操作创建XOR画笔。
答案 3 :(得分:0)
或者,如果允许,您可以使用背景颜色(您的选择)作为文本(例如黑色背景上的白色文本)。
否则,您需要捕获写入文本的矩形(对于每个帧),create the negative image of it,然后在矩形中获取median颜色并使用它来编写文本。
更复杂的解决方案可以让你使用两层(初始图片 - L1和文本(透明背景,黑色文本) - L2), 在组合它们之前,从L2包含所有包含文本的像素,并将文本的每个像素的颜色更改为L1的“负”基础像素颜色值,但是你不会得到一些太可用的东西。 “观众的”观点。
答案 4 :(得分:0)
这可能是the answer by reinier上的一些变体。
有关最后一个选项的一些示例,请查看SlideShare上Advanced OSM Cartography中的幻灯片18和21。
答案 5 :(得分:0)
以下代码段显示了如何反转颜色(背景),然后应用Dinah的建议使用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);
}