Graphics.Drawstring looks nice in PictureBox but horrible in a Bitmap

Dan picture Dan · Aug 5, 2010 · Viewed 19k times · Source

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:

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

Answer

Dan picture Dan · Aug 5, 2010

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

    g2.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
    g2.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    g2.CompositingQuality = Drawing2D.CompositingQuality.HighQuality