【问题标题】:How to draw completely monocolor text with use of Graphics.DrawString?如何使用 Graphics.DrawString 绘制完全单色的文本?
【发布时间】:2015-03-01 19:43:30
【问题描述】:
Bitmap bmp = new Bitmap(300, 50);
Graphics gfx = Graphics.FromImage(bmp);
gfx.DrawString("Why I have black outer pixels?", new Font("Verdana", 14),
    new SolidBrush(Color.White), 0, 0);
gfx.Dispose();
bmp.Save(Application.StartupPath + "\\test.png", ImageFormat.Png);

我需要文本完全是白色的。我尝试了不同的画笔,如 Brushes.White 等,但都不好。我能做些什么?所有文本像素必须是白色的,只是不透明度可以改变。

【问题讨论】:

    标签: c# string graphics colors drawstring


    【解决方案1】:

    已解决:(将textrenderinghints与drawstring结合使用)

            Bitmap bmp = new Bitmap(300, 50);
            Graphics gfx = Graphics.FromImage(bmp);
    
            gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
            gfx.DrawString("Why I have black outer pixels?", new Font("Verdana", 14),
                new SolidBrush(Color.White), 0, 0);
            gfx.Dispose();
            bmp.Save(Application.StartupPath + "\\test.png", ImageFormat.Png);
    

    【讨论】:

    • 我不能承受任何黑暗。这是用于游戏翻译。游戏使用透明颜色上的白色文本并为其添加不同的蒙版。所以我必须以同样的方式将其替换为翻译文本。
    • 嗯,这个是我比较喜欢的。谢谢。
    【解决方案2】:

    这是因为位图的背景是透明的黑色。尝试在绘制之前使其成为透明的白色:

    gfx.Clear(Color.FromArgb(0, 255, 255, 255));
    

    显然这不会改变任何事情。请改用TextRenderer.DrawText。它允许您指定背景颜色:

    TextRenderer.DrawText(gfx, "text", font, point, foreColor, backColor);
    

    但是它可能只是填充文本矩形。我不知道。或者重复我们在上面所做的 (gfx.Clear(...)),使用没有背景颜色的 TextRenderer.DrawText 重载。

    gfx.Clear(Color.FromArgb(1, 255, 255, 255));
    TextRenderer.DrawText(gfx, "text", font, point, Color.White)
    

    所有这些技巧似乎都没有任何效果。剩下的唯一选择似乎是禁用抗锯齿。这是通过SmoothingMode 用于非文本绘制(线条圆圈等)和TextRenderingHint 用于文本渲染完成的。

    gfx.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; // For text
    gfx.SmoothingMode = SmoothingMode.None; // For geometrical objects
    

    【讨论】:

    • 出于某种奇怪的原因,没有任何变化。你测试了吗?
    • 没有。试试gfx.Clear(Color.FromArgb(1, 255, 255, 255));。也许Color 结构太聪明了,将完全透明的白色转换回透明的黑色。透明度为 1 可以解决问题。
    • 什么都没有了......而且带有 backColor 的版本只是用白色填充所有内容,但我需要透明背景上的白色文本。
    • 好吧,那么似乎剩下的唯一选择就是关闭抗锯齿...Graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit
    • 好吧,我刚看了SmoothingMode不影响文字。请改用TextRenderingHint
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多