Есть ли лучшие способы сглаживания текста на .NET 2.0? - PullRequest
4 голосов
/ 24 ноября 2011

Я хочу использовать псевдоним как на этом снимке экрана:

enter image description here

Я перепробовал все TextRenderingHints, но все равно выглядит плохо. Обратите внимание, что когда я делал скриншот, PNG сглаживает его , но вы все равно можете видеть, что второй текст не так хорош, как первый.Вот мой код:

private void Form1_Paint(object sender, PaintEventArgs e) {
    try {
        SolidBrush solidBrush = new SolidBrush(Color.Black);
        PrivateFontCollection fonts;
        FontFamily family = LoadFontFamily(Properties.Resources.SegoeWP_Light, out fonts);
        Font font = new Font(family, 18);
        e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
        e.Graphics.TextRenderingHint = TextRenderingHint.SystemDefault;
        e.Graphics.DrawString("Downloads", font, solidBrush, new PointF(135, 80));
    } catch (Exception ex) {
        MessageBox.Show(ex.ToString());
    }
}

Есть ли другой способ сглаживания шрифтов в WinForms (.NET 2.0)?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Я считаю, что Photoshop делает передискретизацию. Возможно, вы не сможете получить результаты, столь же хорошие, как в Photoshop - у него есть улучшенные алгоритмы привязки к пикселям, и, вероятно, такие вещи, как незначительное увеличение контуров для получения более темного результата - но если SmoothingMode.AntiAlias (как предложил Джордж) недостаточно, вы можете попробовать эти шаги, чтобы увидеть, получают ли они желаемый результат.

  1. Создайте новый Font размером в два раза больше того, что вы хотите получить.
  2. Измерьте текст, используя больший шрифт, и создайте Bitmap этого размера. Обязательно создайте его в формате, поддерживающем альфа-прозрачность.
  3. Нарисуйте текст к вашему Bitmap (в (0, 0)). (Вы, вероятно, хотите использовать SmoothingMode.AntiAlias здесь.)
  4. Нарисуйте Bitmap к конечной цели, уменьшив ее на 50%. Убедитесь, что вы используете высококачественный режим изменения размера.

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

Большое беспокойство вызывает то, что ваш текст может получиться недостаточно темным - если линии прорисовываются с шириной 1 пиксель в 2х размере, то в конечном результате они будут только на 50% черными. Лучший способ справиться с этим - выбрать шрифт с более толстыми линиями. Вы также можете попробовать перерисовать текст в вашем Bitmap - нарисуйте его один раз в (0, 0), затем снова в (0, 1) или (1,0) - чтобы увидеть, достаточно ли это утолщает линии, чтобы выглядеть хорошо, как только вы уменьшите размер. Вам придется экспериментировать.

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

3 голосов
/ 24 ноября 2011

Я бы подумал, что приведенного ниже было бы достаточно.

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;

Если нет, возможно, попробуйте образец на странице ниже без изменений, а затем постепенно добавляйте свои изменения до тех пор, пока они не сломаются.

Как: использовать сглаживание с текстом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...