Graphics.Drawstring выглядит красиво в PictureBox, но ужасно в растровом изображении - PullRequest
4 голосов
/ 05 августа 2010

Я пытаюсь использовать 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

Ответы [ 2 ]

5 голосов
/ 05 августа 2010

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

    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    g2.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
0 голосов
/ 05 августа 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

...