Graphics.Drawstring выглядит красиво в PictureBox, но ужасно в Bitmap

Я пытаюсь использовать DrawString для записи текста в виде изображения, а затем поворачиваю его на 90 градусов. Он отлично работает как с растровым изображением, так и непосредственно с PictureBox, но большая разница заключается в качестве. Нарисованный PictureBox текст имеет отличное качество и выглядит красиво. Когда я рисую это на изображении, оно выглядит ужасно и блочно. Я внес несколько изменений, чтобы попытаться сделать его лучше, но он выглядит не так хорошо, как должен.

Образец кода:

Используйте проект Windows Forms, поместите на него 2 поля с изображениями и кнопку и запустите его со следующим кодом, чтобы понять, что я имею в виду:

Public Class Form1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

       Dim g As System.Drawing.Graphics
       g = PictureBox1.CreateGraphics

       ' x.DrawRectangle(New Pen(Brushes.White, 200), New Rectangle(0, 0, 200, 200))
       g.TranslateTransform(10.0F, 0.0F)
       g.RotateTransform(90)
       g.DrawString("MM Components", New Font("Arial", 7, FontStyle.Regular), Brushes.DarkBlue, New PointF(0, 0))

       Dim g2 As System.Drawing.Graphics
       Dim img As New Bitmap(300, 300, Drawing.Imaging.PixelFormat.Format24bppRgb)
       g2 = Graphics.FromImage(img)

       g2.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
       g2.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
       g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
       ' img.SetResolution(150, 150)

       ' x.DrawRectangle(New Pen(Brushes.White, 200), New Rectangle(0, 0, 200, 200))
       g2.TranslateTransform(10.0F, 0.0F)
       g2.RotateTransform(90)
       g2.FillRectangle(Brushes.White, 0, 0, 300, 300)
       g2.DrawString("MM Components", New Font("Arial", 7, FontStyle.Regular), Brushes.DarkBlue, New PointF(0, 0))
       PictureBox2.Image = img

      'System.Threading.Thread.Sleep(20)
   End Sub
End Class

person Dan    schedule 05.08.2010    source источник


Ответы (2)


Эти изменения, кажется, делают его красивым....

    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    g2.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
person Dan    schedule 05.08.2010
comment
Да, TextRenderingHint — это то, что имеет значение. - person Hans Passant; 06.08.2010
comment
Это требует, чтобы все 3 свойства были установлены. TextRenderingHint=ClearTypeGridFit Одного было недостаточно, чтобы получить высококачественную визуализацию текста, которую я искал. - person Dan; 09.08.2010

Разница здесь, как вы заметили, ClearType.

Прочтите это для получения дополнительных сведений о том, что это такое и как это работает: http://msdn.microsoft.com/en-us/library/dd183433(VS.85).aspx

Также еще один отчет о той же проблеме на форумах msdn с включенным исправлением:

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/9a66c7a2-79ad-4c9b-91cc-361ec72d13de

person Kilanash    schedule 05.08.2010