使用 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()
方法中看到我尝试过的各种方法的注释。
如有任何想法,我们将不胜感激。
谢谢!
您尝试的TextRenderingHint
和SmoothingMode
值实际上是counter-productive。
如果您不想让抗锯齿像素在文本周围旋转,请将其关闭!
将 TextRenderingHint
设置为 SingleBitPerPixelGridFit
或 SingleBitPerPixel
应该效果更好。
但是即使有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);
}
}
}
}
这是我的输出文件:
很酷。这就是我几个小时前给你投票的理由。
我正在尝试使用 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()
方法中看到我尝试过的各种方法的注释。
如有任何想法,我们将不胜感激。
谢谢!
您尝试的TextRenderingHint
和SmoothingMode
值实际上是counter-productive。
如果您不想让抗锯齿像素在文本周围旋转,请将其关闭!
将 TextRenderingHint
设置为 SingleBitPerPixelGridFit
或 SingleBitPerPixel
应该效果更好。
但是即使有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);
}
}
}
}
这是我的输出文件:
很酷。这就是我几个小时前给你投票的理由。