的图像上绘制一个对比串(Drawing a contrasted string on an imag

2019-06-27 00:19发布

所以,我有一个视频源,这是我进入图像的快照,抓住一个图形对象,然后在图像的右下角绘制一个时间戳。 迄今没问题。 但是,我不能保证什么颜色将是后面的文字,所以不管我用什么刷,它几乎肯定会用一些,它是绘制在图像的交锋,使文字难以阅读。

我想知道是否有人知道的一种方式(无论是在.NET的方法,还是一个不错的算法),用于确定基于其背后的图像上的字符串的最佳色彩。

干杯

Answer 1:

 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


Answer 2:

唯一可靠的方法是使用对比的轮廓。



Answer 3:

早在中64代子画面图形的日子里,如果你想要的东西站出来反对任何背景,则使用XOR位图传输。 有人提到这是“反向视频”。

你可以画线用这种方式ControlPaint.DrawReversibleLine ,但不会对文字工作。

这CodeProject上的文章显示了如何使用互操作来创建一个XOR刷gdi32.dll



Answer 4:

或者,如果它是允许的,你可以使用文本(例如,白色文本黑色背景),背景色(你的选择)。

否则,你就需要捕获其中的文字写入(每帧)的矩形, 创建它的负面形象 ,然后拿到位数在矩形的颜色,并用它来写的文字。

一个更复杂的解决方案将让你使用两层(初始图片 - L1和文本(透明背景,黑色文本) - L2),并结合他们之前,采取一切从L2包含文本的像素和改变颜色为每个文本至“负面”底层像素颜色L1的值的像素,但你不会得到的东西太有用从“观察者”的观点。



Answer 5:

这可能是一个数量上的变化由reinier答案 。

  1. 绘制基础文本(四抵消reinier提到的那些)没有黑色,但实际上以对比色的actualy文本的前景色。
  2. 绘制文本两次:一次以对比色,但在大胆和/或略大的尺寸,然后在文本前景色了这一点。 可能要摆弄了一下坐标,甚至需要做的每一句话,甚至人物的绘制,以同时获得通过很好地对齐,而不是给一个丑陋的最终结果。
  3. 做什么reinier建议 ,但也许不是四次(四个方向),但也许三个甚至两次获得一种“阴影”的样子。
  4. 让“使用API​​调用由像素绘制文本像素”的方法去整,并使用先进的多层合成技术就像在WPF设计可用的人。

对于最后一个选项的一些例子,看看幻灯片18和21在高级OSM制图在SlideShare上。



Answer 6:

下面的代码片段展示了如何反转的颜色(背景),然后应用黛娜的建议创建使用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);
}


文章来源: Drawing a contrasted string on an image