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

awh*_*112 3 c# pdf asp.net-mvc system.drawing itext

我正在尝试使用 iTextSharp 将图像写入 PDF,但除了写入的图像之外,我还需要向 PDF 添加文本。似乎最好的方法是将文本写为图像并将其插入到页面上。一切都很好,但是当我查看文本时,我发现它的质量比我想要的要低。我最终得到这样的东西:

在此输入图像描述

您可以看到有很多与周围的纯色背景不同的“点”。这是我用来绘制文本的代码:

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;
    }
Run Code Online (Sandbox Code Playgroud)

以及 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);
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是 iTextSharpScaleToFit()或绘图方法的问题,但我想稍微清理一下背景颜色。你可以看到我尝试过的各种方法都被注释掉了DrawText()

任何想法将不胜感激。

谢谢!

TaW*_*TaW 5

TextRenderingHint您尝试的和值SmoothingMode实际上会适得其反。

如果您不希望抗锯齿像素在文本周围旋转,请将其关闭!设置TextRenderingHintSingleBitPerPixelGridFitSingleBitPerPixel应该效果更好。

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

每当涉及到文字时就不要使用 jpeg,这仅限于照片,但是可以使用 png

所以首先改变

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Jpeg));
Run Code Online (Sandbox Code Playgroud)

Image titleImg = Image.GetInstance(title.ToStream(ImageFormat.Png));
Run Code Online (Sandbox Code Playgroud)

然后检查您是否仍想优化TextRenderingHint

请注意,这个答案严格来说是为了消除文本周围的伪影。

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