views:

71

answers:

2

I am trying to use DrawString to write text as an image and then rotate it 90 degrees. It works fine with both a bitmap or directly on a PictureBox, but the big difference is in the quality. The PictureBox text drawn has great quality and looks nice. When I draw it on an image it looks horrible and blocky. I've made a few changes to try and get it to look nicer, but it doesn't look nearly as nice as it should.

Sample code:

Use a Windows Forms project and place 2 picture boxes on it and a button and run it with the following code to see what I mean:

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

+1  A: 

These changes seem to make it look nice....

    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    g2.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality
Dan
Yes, the TextRenderingHint is the one that counts.
Hans Passant
Ity required all 3 properties to be set. TextRenderingHint=ClearTypeGridFit alone wasn;t enough to get the high quality text rendering I was looking for.
Dan
A: 

The difference here is, as you noted, ClearType.

Read this for more explanation on what it is and how it works: http://msdn.microsoft.com/en-us/library/dd183433(VS.85).aspx

Also another report of the same issue on msdn forums, with included fix:

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

Kilanash