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

时间:2016-01-06 15:35:42

标签: c# asp.net-mvc pdf itextsharp system.drawing

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

enter image description here

你可以看到有很多"点"与周围的固体背景不同。这是我用来绘制文本的代码:

httpMultipartContent.Add( httpMultipartContent );

以及PDF编写者的相关文字:

httpMultipartContent.Add( httpStreamContent );

我不确定这是iTextSharp 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; } 或绘图方法的问题,但我想稍微清理一下背景颜色。您可以看到我尝试使用 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); 方法评论过的各种方法。

任何想法都会受到赞赏。

谢谢!

2 个答案:

答案 0 :(得分:4)

您尝试的TextRenderingHintSmoothingMode值实际上会适得其反。

如果您不希望在文本周围旋转的抗锯齿像素将其关闭! 将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并在您的应用程序的上下文中这是一个很好的,您可能想要发布的新问题。 (包括你的失败努力和所需结果的图像......!)

答案 1 :(得分:0)

我使用了你的代码,结果非常好。

我清理了将其分成两(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);
            }
        }
    }

}

这是我的输出文件:

screenshot

非常酷。这是我几个小时前给你那个upvote的理由。