Почему шрифт System.Drawing + ClearType имеет ужасные черные фрагменты? - PullRequest
1 голос
/ 20 сентября 2011

Я использую следующий код C #, чтобы создать картинку с текстом

            // Create font. Parameter is a global variable
        Font objFont = new Font(fontname, fontsize, fontstyle, System.Drawing.GraphicsUnit.Pixel);

        // Grab an existing image from picture box. (target is picturebox's name)
        Bitmap result;
        if (target.Image != null)
        {
            result = new Bitmap(target.Image);
        }
        else
        {
            result = new Bitmap(target.Width, target.Height);
        }
        Graphics objGraphics = Graphics.FromImage(result);

        // And draw to it. Select a mode with check box.

        objGraphics.SmoothingMode = SmoothingMode.HighQuality;
        if (!checkBox1.Checked)
        {
            objGraphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
        }
        else
        {
            objGraphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
        }
        Brush b = new LinearGradientBrush(new Rectangle(new Point(x, y), objGraphics.MeasureString(text, objFont).ToSize()),color1,color2,LinearGradientMode.Vertical);

        objGraphics.DrawString(text, objFont, b, x, y);
        objGraphics.Save();

        //Set the result to picturebox

        target.Image = result;

        objGraphics.Dispose();
        b.Dispose();

до этого кода, target.BackColor был установлен в желаемый цвет, например

target.BackColor = Color.Black;

Вот результаты:

http://image.free.in.th/z/ie/yqbsg.png

Мне было интересно, почему шрифт ClearType выглядит так безобразно на ярком bg?(На bg, как темно-фиолетовый, вы не заметите черную рамку, но она все еще там)

1 Ответ

7 голосов
/ 20 сентября 2011
    else
    {
        result = new Bitmap(target.Width, target.Height);
    }

Это проблема, вы не инициализировали пиксели растрового изображения.По умолчанию они будут Color.Transparent.Что приводит к сглаживанию текста черным цветом, так как Color.Transparent имеет красный, зеленый и синий цвета в 0. Когда вы затем отображаете растровое изображение на розовом фоне, пиксели сглаживания становятся очень видимыми, так как они не были нарисованы, чтобы смешиватьсяв розовый фон.Они хорошо смотрятся только на черном фоне.

Вам нужно использовать Graphics.Clear ().Или отказаться от сглаживания, если прозрачность была предназначена.

...