Слияние графических объектов неправильно отображает текст - PullRequest
1 голос
/ 13 марта 2012

Я пытаюсь решить проблему с помощью пользовательского элемента управления, перенесенного из приложения VCL C ++.Идея состоит в том, что отдельные части элемента управления сначала рисуются в новом объекте Graphics, а затем объединяются с объектом Graphics из метода рисования элемента управления.

Я создал упрощенный пример:

using System.Drawing;
using System.Windows.Forms;

namespace Test
{
    public class Form1 : Form
    {
        private PictureBox pictureBox;

        public Form1()
        {
            pictureBox = new PictureBox();
            pictureBox.Dock = DockStyle.Fill;
            pictureBox.Paint += new PaintEventHandler(pictureBox_Paint);

            ClientSize = new Size(100, 50);
            Controls.Add(pictureBox);
        }

        private void pictureBox_Paint(object sender, PaintEventArgs e)
        {
            SolidBrush blackBrush = new SolidBrush(Color.Black);

            Bitmap bitmap = new Bitmap(pictureBox.Width, pictureBox.Height);
            Graphics graphics = Graphics.FromImage(bitmap);

            Font font = new Font(pictureBox.Font, FontStyle.Regular);
            graphics.DrawString("simple test", font, Brushes.Black, 0, 0);

            e.Graphics.DrawImage(bitmap, 0, 0);
        }
    }
}

Выполнение приведенного выше кода приводит к тому, что текст рисуется слишком толстым:

Когда я изменяю код, чтобы нарисовать текст непосредственно в объект Graphics объекта PictureBox, который я получаюправильный результат:

Эта проблема возникает только при визуализации текста.Линии и другие формы отображаются правильно.Есть идеи, как это решить?

Заранее спасибо.

1 Ответ

1 голос
/ 13 марта 2012

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

Это не проблема на 2-м скриншоте, потому что пиксели фона были нарисованы серым как линкор с помощью метода Form.OnPaintBackground () по умолчанию. Просто добавьте метод Graphics.Clear (), чтобы решить вашу проблему:

using (var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height)) {
    using (var graphics = Graphics.FromImage(bitmap)) {
        graphics.Clear(this.BackColor);                // <== NOTE: added
        graphics.DrawString("simple test", pictureBox1.Font, Brushes.Black, 0, 0);
    }
    e.Graphics.DrawImage(bitmap, 0, 0);
}

С добавлением с помощью операторов , предотвращающих сбой вашей программы, когда сборщик мусора запускается недостаточно часто.

...