Graphis.DrawString всегда использует шрифт по умолчанию - PullRequest
0 голосов
/ 27 июня 2019

У меня есть проект, в котором я создаю изображение с повернутым текстом вокруг невидимого круга.

Рисунок сам по себе работает просто отлично. Однако, кажется, что независимо от того, какой шрифт я использую, я всегда получаю один и тот же результат, который я предполагаю, что используется какой-то шрифт низкого качества по умолчанию.

Вот код:

        Bitmap objBmpImage = new Bitmap(1000, 1000);

        System.Drawing.Text.InstalledFontCollection installedFontCollection = new System.Drawing.Text.InstalledFontCollection();
        FontFamily[] fontFamilies = installedFontCollection.Families;

        System.Drawing.Font objFont = new System.Drawing.Font(fontFamilies.Where(x => x.Name == "Arial").FirstOrDefault(),10);

        Graphics objGraphics = Graphics.FromImage(objBmpImage);
        objGraphics.Clear(Color.Transparent);

        float angle = (float)360.0 / (float)competences.Count();

        objGraphics.TranslateTransform(500, 450);

        objGraphics.RotateTransform(-90 - (angle / 3));
        int nbComptetence = competences.Count();
        int indexCompetence = 0;
        foreach (T_Ref_Competence competence in competences)
        {
            byte r, g, b;
            HexToInt(competence.T_Ref_CompetenceNiveau2.T_Ref_CompetenceNiveau1.Couleur, out r, out g, out b);
            Brush brush = new System.Drawing.SolidBrush(Color.FromArgb(255,r,g,b));

            if (indexCompetence * 2 < nbComptetence)
            {
                objGraphics.DrawString(competence.Nom, objFont, brush, 255, 0);
                objGraphics.RotateTransform(angle);
            }
            else
            {
                objGraphics.RotateTransform(180);
                objGraphics.RotateTransform(angle/2);
                float textSize = objGraphics.MeasureString(competence.Nom, objFont).Width;
                objGraphics.DrawString(competence.Nom, objFont, brush, -253 - textSize, 0);
                objGraphics.RotateTransform(angle);
                objGraphics.RotateTransform(-180);
                objGraphics.RotateTransform(-angle / 2);

            }



            indexCompetence++;
        }

Я получаю шрифт, используя установленные семейства, подобные этому

    System.Drawing.Text.InstalledFontCollection installedFontCollection = new System.Drawing.Text.InstalledFontCollection();
    FontFamily[] fontFamilies = installedFontCollection.Families;

    System.Drawing.Font objFont = new System.Drawing.Font(fontFamilies.Where(x => x.Name == "Arial").FirstOrDefault(),10);

Я пытался использовать другой шрифт, но результат всегда один и тот же. Что-то я пропускаю? Если нет, в чем может быть причина?

Спасибо

РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос, что именно я хочу, рассмотрим это:

enter image description here

Это изображение - скриншот веб-сайта, который я делаю. Диаграмма в середине была сгенерирована с использованием charts.js, но ее ограничение заставляет меня рисовать текст как фоновое изображение. На самом деле он занимает большую часть моего экрана, поэтому он не может стать намного больше, чем этот. Как видите, шрифт текста довольно размыт, и я бы просто хотел, чтобы его было легче читать. Я думал, что проблема была в шрифте, но я не знаю.

Я не очень знаком со всей частью рисования изображений в C #, поэтому, если есть лучший способ рисовать мой текст (который может меняться в зависимости от многих переменных), я с удовольствием попробую другие вещи.

1 Ответ

2 голосов
/ 27 июня 2019

Вариант 1: изменить отображение текста

objGraphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel

Вариант 2: изменить режим сглаживания

objGraphics.InterpolationMode=InterpolationMode.NearestNeighbor;

Вариант 3: изменить DPI изображения

Вы получите наилучший результат, если масштабировать входное изображение, а затем рисовать текст с более высоким разрешением.

Значение DPI по умолчанию для растрового изображения - 96. Вероятно, библиотека JS экспортируется с этим параметром.

Если вы хотите более плавный рендеринг шрифта, вам нужно увеличить DPI, например,

objBmpImage.SetResolution(1200,1200);

Если вы это сделаете, вам, вероятно, потребуется увеличить количество пикселей, которые есть у вашего растрового изображения.

Если «некрасивый» текст только что уместился в изображение 1000x1000, теперь вам нужно 1000 * 1200/96 = 12500 пикселей.

До изменения (с использованием Arial 10 pt):

24 pixel wide J

После изменения (по-прежнему используется Arial 10 pt):

180 pixel wide J

Обратите внимание, что размер в сантиметрах не меняется. Так что он все равно будет печататься хорошо.

...