Graphics.Drawstring выглядит красиво в PictureBox, но ужасно в растровом изображении
Я пытаюсь использовать 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 ответа
Эти изменения, кажется, заставляют это выглядеть хорошо....
g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g2.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
Разница здесь, как вы заметили, 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