C# 使用GDI+;绘制文本时,是否可以定义精确的字体大小;?

C# 使用GDI+;绘制文本时,是否可以定义精确的字体大小;?,c#,windows,gdi+,C#,Windows,Gdi+,我使用以下代码在位图上绘制文本: using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point)) { //draw the text graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat); } 很好用。以下是渲染文本: 我想把文本放大一点。如果我将11设置为字体大小,我得到的结果如下:

我使用以下代码在位图上绘制文本:

using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
    //draw the text
    graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat);
}
很好用。以下是渲染文本:

我想把文本放大一点。如果我将11设置为字体大小,我得到的结果如下:

这对我想要的东西来说太大了。 我试过10.25,10.5等等,但结果和10一样

我还尝试将
GraphicsUnit
设置为
Pixel
,但其行为相同(无法设置自定义字体大小)

我的问题是:

使用GDI+(C#)绘制文本时,是否有可能“微调”渲染文本的大小?


编辑: 更完整的代码段(根据要求):

Graphics.DrawString()存在严重且无法解决的精度问题,它仅适用于打印机等高分辨率设备

请改用.NET 2.0 TextRenderer.DrawText()方法。

我不知道C#或.NET库,但是,看看,为
TextRenderingHint
选择
AntiAlias
应该关闭提示并打开反锯齿。这将为您提供更多的中间尺寸,但可能是更模糊的文本

问题是字体暗示。当字体的细节(如衬线的笔划宽度或大小)与目标设备的分辨率顺序相同时,简单地将设计单位缩放到设备单位可能会导致文本不平衡、不均匀,尤其是在没有任何类型的抗锯齿的情况下

为了避免这种情况,大多数字体都有“提示”,当分辨率受到限制时,这些提示给出了四舍五入的特殊大小写规则。其效果是在尺寸中看到“台阶”


如果你想避免这些步骤,你必须关闭“暗示”。这将导致光栅化器忽略特殊的舍入规则,直接将设计单位缩放到设备单位。这使您可以真正线性缩放文本。权衡的结果是,文本在小尺寸时可能看起来不太好。抗锯齿可以改善对称性,但对许多人来说,文本可能看起来模糊。

试试
textrendinghint.ClearTypeGridFit
我试过graphics.textrendinghint=textrendinghint.ClearTypeGridFit,但它会给出同样的结果。我怀疑你的
StringFormat
是错误的。IIRC,我成功地使用了
FitBlackBox
。事实上,我根据非常具体的高度设置将字体宽度调整为一个整数。有一件事我忘了提及:该代码用于ASP.NET 3.5应用程序中的.ashx服务。使用System.Windows.Forms程序集(默认情况下不包括)安全吗?我尝试了TextRenderer.DrawText()方法。字体大小9.7的渲染效果与我问题中的第一张图片相似,而9.8的渲染效果与第二张图片相似。所以基本上它不起作用。是否有一些标志/选项需要设置?我尝试将GraphicsUnit设置为Pixel and leppie suggestion,但运气不佳。请改进您的代码片段,以显示位图是如何创建的。在调试器中检查其HorizontalResolution属性。HorizontalResolution为96.0fTextRenderer.DrawText在dpi级别上有一些舍入问题,而不是96 dpi,这是由于这行WindowsFont()this.logFont.lfHeight=-(int)Math.天花((双)WindowsGraphicsCacheManager.MeasurementGraphics.DeviceContext.DpiY*(双倍)尺寸/72.0);
using (Bitmap bitmap = new Bitmap(width, height))
using (Graphics graphics = Graphics.FromImage(bitmap))     
using (Font font = new Font("Arial", 10.0f, FontStyle.Bold, GraphicsUnit.Point))
{
   graphics.SmoothingMode = SmoothingMode.AntiAlias;
   graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

   Rectangle rect = new Rectangle(0, 0, width, height);

   //method 1
   StringFormat stringFormat = new StringFormat();
   stringFormat.Alignment = StringAlignment.Center;
   stringFormat.LineAlignment = StringAlignment.Center;
   graphics.DrawString("Some text", font, Brushes.White, rect, stringFormat);

   //method 2
   TextFormatFlags flags = TextFormatFlags.HorizontalCenter |
       TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;       
   TextRenderer.DrawText(graphics, "Some text", font, rect, Color.White, flags);

   bitmap.Save(stream, ImageFormat.Png);          
}