GDI +大字体大小渲染和ClearType

时间:2014-03-03 06:57:44

标签: c# fonts gdi+ cleartype

我正在尝试使用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渲染时,它看起来像这样:

Segoe UI_48

但是,使用字体大小72进行渲染会使ClearType消失:

Segoe UI_72

为什么会这样?我知道TextRenderingHint.ClearTypeGridFit是一个提示而不是一个订单,但是我能以某种方式强迫它一直使用ClearType吗?

0 个答案:

没有答案