使用 System.Drawing 绘制文本时的低分辨率图像

Low-resolution image when drawing text using System.Drawing

我正在尝试使用 iTextSharp 将图像写入 PDF,但除了正在写入的图像之外,我还需要将文本添加到 PDF。看起来最好的方法是将文本写成图像并将其插入到页面上。一切正常,但是当我查看文本时,我发现它的质量低于我想要的。我最终得到这样的结果:

你可以看到有很多"dots"不同于周围的纯色背景。这是我用来绘制文本的代码:

private System.Drawing.Image DrawText(String text, System.Drawing.Font font, Color textColor, Color backColor)
    {
        Bitmap img = new Bitmap(1, 1);
        Graphics drawing = Graphics.FromImage(img);

        SizeF textSize = drawing.MeasureString(text, font);

        img.Dispose();
        drawing.Dispose();

        img = new Bitmap((int) textSize.Width, (int) textSize.Height);
        //img.SetResolution(200, 200);

        drawing = Graphics.FromImage(img);

        drawing.Clear(backColor);

        Brush textBrush = new SolidBrush(textColor);

        drawing.DrawString(text, font, textBrush, 0, 0);
        //drawing.TextRenderingHint = TextRenderingHint.AntiAlias;
        //drawing.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
        //drawing.SmoothingMode = SmoothingMode.HighQuality;

        //img.MakeTransparent(Color.MediumAquamarine);

        drawing.Save();

        textBrush.Dispose();
        drawing.Dispose();

        return img;
    }

以及PDF作者的相关文字:

    var name = DrawText(Request.Form["name"], font, Color.Black, Color.White);
    ...
    Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Jpeg));
    titleImg.SetAbsolutePosition(float.Parse(Request.Form["x"]), float.Parse(Request.Form["y"]));
    titleImg.ScaleToFit(16, 16);           
    pdfContentByte.AddImage(titleImg);

我不确定这是否是 iTextSharp ScaleToFit() 或绘图方法的问题,但我想稍微清理一下背景颜色。您可以在 DrawText() 方法中看到我尝试过的各种方法的注释。

如有任何想法,我们将不胜感激。

谢谢!

您尝试的TextRenderingHintSmoothingMode值实际上是counter-productive。

如果您不想让抗锯齿像素在文本周围旋转,请将其关闭! 将 TextRenderingHint 设置为 SingleBitPerPixelGridFitSingleBitPerPixel 应该效果更好。

但是即使有SmoothingMode.AntiAlias,如果你不另存为,像素化肯定不会那么强烈jpeg, 这可能是唯一真正的错误

只要涉及到文本不要使用jpeg,照片是严格的但是使用 png!

所以

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Jpeg));

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Png));

然后检查您是否仍要优化TextRenderingHint!

注意这个答案严格来说是关于去除文本周围的瑕疵。

将文本输入 PFD 文档的最佳且完全可扩展的方法是输入真实文本,而不是位图,正如 mkl 评论的那样。如何使用 ITextSharp 并在您的应用程序上下文中做到这一点是您可能想要 post 的一个很好的新问题。 (包括你失败的努力和期望结果的图像......!)

我用了你的代码,结果很不错。

我清理了将其分成两 (2) 个单独方法的方法,然后我从更大的位图(不是 1x1)开始:

using System;
using System.Drawing;

class Program
{

    public static Color COLOR_TEXT = Color.Red;
    public static Color COLOR_BACK = Color.White;

    static void Main(string[] args)
    {
        var font = new Font(FontFamily.GenericMonospace, 35);
        var image = DrawClass.DrawText2("Stack Overflow\r\n\tby jp2code", font, COLOR_TEXT, COLOR_BACK);
        image.Save("C:\jp2code.bmp");
    }

    public static Image DrawText2(String text, Font font, Color textColor, Color backColor)
    {
        var textSize = GetTextSize(text, font);
        var result = new Bitmap((int)textSize.Width, (int)textSize.Height);
        using (var g = Graphics.FromImage(result))
        {
            g.Clear(backColor);
            var brush = new SolidBrush(textColor);
            g.DrawString(text, font, brush, 0, 0);
            g.Save();
        }
        return result;
    }

    public static SizeF GetTextSize(String text, Font font)
    {
        using (var img = new Bitmap(200, 100))
        {
            using (var g = Graphics.FromImage(img))
            {
                return g.MeasureString(text, font);
            }
        }
    }

}

这是我的输出文件:

很酷。这就是我几个小时前给你投票的理由。