我正在尝试使用GDI +将大尺寸字体字符渲染到位图以供以后离线使用(确切地说,作为使用Windows Phone上的Direct3D绘制文本的位图字体)。我想使用ClearType渲染字体,但是当字体大小大于48磅时,我似乎无法做到这一点。这是我正在使用的代码:
static void Main(string[] args)
{
var noFontFallbackFormat = (StringFormat)StringFormat.GenericTypographic.Clone();
noFontFallbackFormat.FormatFlags |= StringFormatFlags.NoFontFallback;
DrawCharacter("Segoe UI", 48, noFontFallbackFormat);
DrawCharacter("Segoe UI", 72, noFontFallbackFormat);
}
static void DrawCharacter(string fontName, float fontSize, StringFormat stringFormat)
{
var fontSizeInPixels = fontSize * 96.0f / 72.0f; // Converts points to pixels
using (var font = new Font(fontName, fontSizeInPixels, FontStyle.Regular, GraphicsUnit.Pixel))
{
using (var bitmap = new Bitmap(256, 256, PixelFormat.Format32bppArgb))
{
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
var text = "A";
var characterSize = graphics.MeasureString(text, font, Point.Empty, stringFormat);
int width = (int)Math.Ceiling(characterSize.Width);
int height = (int)Math.Ceiling(characterSize.Height);
graphics.Clear(Color.Black);
graphics.DrawString(text, font, new SolidBrush(Color.White), 0, 0, stringFormat);
graphics.Flush();
using (var characterBitmap = bitmap.Clone(new Rectangle(0, 0, width, height), PixelFormat.Format32bppArgb))
{
characterBitmap.Save(string.Format("{0}_{1}.png", fontName, fontSize));
}
}
}
}
}
使用字体大小48渲染时,它看起来像这样:
但是,使用字体大小72进行渲染会使ClearType消失:
为什么会这样?我知道TextRenderingHint.ClearTypeGridFit是一个提示而不是一个订单,但是我能以某种方式强迫它一直使用ClearType吗?