Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在图像上绘制对比字符串_C#_String_System.drawing - Fatal编程技术网

C# 在图像上绘制对比字符串

C# 在图像上绘制对比字符串,c#,string,system.drawing,C#,String,System.drawing,所以,我有一个视频源的快照,我把它放到一个图像中,抓取一个图形对象,然后在图像的右下角画一个时间戳。到目前为止没有问题。然而,我不能保证文本后面会是什么颜色,所以无论我使用什么画笔,它几乎肯定会与它所绘制的一些图像发生冲突,使文本无法阅读 我想知道是否有人知道一种方法(或者是.net中的一种方法,或者是一种很好的算法),可以根据字符串背后的图像来确定字符串的最佳颜色 干杯回到Commodore 64 sprite graphics的时代,如果你想要在任何背景下都能脱颖而出,你可以使用XOR bl

所以,我有一个视频源的快照,我把它放到一个图像中,抓取一个图形对象,然后在图像的右下角画一个时间戳。到目前为止没有问题。然而,我不能保证文本后面会是什么颜色,所以无论我使用什么画笔,它几乎肯定会与它所绘制的一些图像发生冲突,使文本无法阅读

我想知道是否有人知道一种方法(或者是.net中的一种方法,或者是一种很好的算法),可以根据字符串背后的图像来确定字符串的最佳颜色


干杯

回到Commodore 64 sprite graphics的时代,如果你想要在任何背景下都能脱颖而出,你可以使用XOR blitting。有些人将此称为“反向视频”

您可以使用
ControlPaint.DrawReversibleLine
以这种方式绘制线条,但这对文本不起作用


这显示了如何使用interop to
gdi32.dll

创建XOR画笔唯一可靠的方法是使用对比轮廓

或者,如果允许,您可以为文本使用背景色(您的选择)(例如黑色背景上的白色文本)

 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
否则,您需要捕获写入文本的矩形(对于每个帧),然后获取矩形中的颜色并使用它来写入文本

更复杂的解决方案是使用两层(初始图片-L1和文本(透明背景,黑色文本)-L2),
在组合它们之前,从L2中取出包含文本的所有像素,并将文本的每个像素的颜色更改为L1的“负”基本像素颜色值,但从“查看器”的角度看,您不会得到太有用的东西。

这可能是一系列的变化

  • 绘制基础文本(reinier提到的四个偏移文本)不是黑色的,而是与实际文本的前景色形成对比的颜色
  • 绘制文本两次:一次使用对比色,但使用粗体和/或稍大的尺寸,然后使用文本的前景色。可能需要对坐标进行一些调整,甚至需要按照每个单词甚至每个字符进行绘制,以使两个过程很好地对齐,而不会产生难看的最终结果
  • ,但可能不是四次(所有四个方向),而是三次甚至两次,以获得一种“阴影”外观
  • 放弃“使用API调用逐像素绘制文本”的方法,使用先进的多层合成技术,如WPF设计中可用的技术

  • 对于最后一个选项的一些示例,请查看SlideShare中的幻灯片18和21。

    以下片段显示了如何反转颜色(背景),然后应用Dinah的建议使用Graphics.DrawString()创建背景


    这看起来像是对文本应用了一个提纲。我的建议也是我建议在4条对角线上这样做,而不是在北/东南/西。看起来应该是差不多一样的,但是有很多字体,你的角点在做对角线时可读性更好。我也认为这是最好的解决方案!我尝试了模糊等不同的东西,但这只是带来最好的结果!它适用于相对平淡的背景,但会给你非常难看的颜色。建议2不起作用。通过加大文本大小,整个句子变得更宽。实际上,这意味着只有一个句子的中间字符有一个轮廓,它的左右所有字符实际上变得越来越难以辨认。要使这个技巧发挥作用,就必须单独绘制每个字母。(但这是相当棘手的做好事)。此外,建议2不是很好。如果您不断更改基础图像的颜色,这将产生非常恼人的闪烁文本。我的黑色轮廓的建议适用于任何背景。即使是在纯白色的屏幕上,你也只能看到黑色的轮廓。@reinier 1:因此我的评论是,可能需要对每个字符进行文本渲染,并且需要大量的坐标调整以避免产生难看的结果。我希望你读了全文@reinier 2:我不建议更改基础图像的颜色,而是将对比色更改为文本的前景色。所以:无论你在画什么,都要为黑色文本绘制白色轮廓,为白色文本绘制黑色轮廓。
    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);
    }