title: System.Drawing.Graphics.DrawString - "Parameter is not valid" exception
body: <p>Sometimes Microsoft's exception messages are infuriatingly unhelpful. I have created a nice little MVC method to render text. The method body is below. When it reaches the "DrawString" method, I get an exception thrown saying "Parameter is not valid".</p>
  
  <p>Note that the font, as best I can tell is constructed properly (I"m just using Arial at 10pt), the rect size is positive and valid looking, the brush is a white SolidBrush and the format flags do not affect the output; i.e. if I exclude the format flags from the call, I still get an error.</p>
  
  <p>The DrawString call is right near the bottom.</p>
  
  <pre><code>public ActionResult RenderText(
      string fontFamily,
      float pointSize,
      string foreColor,
      string backColor,
      bool isBold,
      bool isItalic,
      bool isVertical,
      string align,
      string[] allText,
      int textIndex)
  {
      // method renders a horizontal or vertical text image, taking all the text strings that will be rendered in each image
      // and sizing the final bitmap according to which text would take the most space, thereby making it possible to render
      // a selection of text images all at the same size.
  
      Response.ContentType = "image/png";
  
      var fmt = StringFormat.GenericTypographic;
      if(isVertical)
          fmt.FormatFlags = StringFormatFlags.DirectionVertical;
  
      Func&lt;string,StringAlignment&gt; getAlign = (s =&gt; {
          switch(s.ToLower())
          {
              case "right": return StringAlignment.Far;
              case "center": return StringAlignment.Center;
              default: return StringAlignment.Near;
          }
      });
      fmt.LineAlignment = isVertical ? StringAlignment.Center : getAlign(align);
      fmt.Alignment = isVertical ? getAlign(align) : StringAlignment.Center;
  
      var strings = (allText ?? new string[0]).Where(t =&gt; t.Length &gt; 0).ToList();
      if(strings.Count == 0)
          strings.Add("[Missing Text]");
  
      FontStyle style = FontStyle.Regular;
      if(isBold)
          if(isItalic)
              style = FontStyle.Bold | FontStyle.Italic;
          else
              style = FontStyle.Bold;
      else if(isItalic)
          style = FontStyle.Italic;
  
      Font font = new Font(fontFamily, pointSize, style, GraphicsUnit.Point);
      Color fc = foreColor.IsHexColorString() ? foreColor.ToColorFromHex() : foreColor.ToColor();
      Color bc = backColor.IsHexColorString() ? backColor.ToColorFromHex() : backColor.ToColor();
  
      var maxSize = new Size(0,0);
      using(var tmp = new Bitmap(100, 200))
          using(var gfx = Graphics.FromImage(tmp))
              foreach(var txt in strings)
              {
                  var size = gfx.MeasureString(txt, font, 1000, fmt);
                  maxSize = new Size(
                      Math.Max(Convert.ToInt32(isVertical ? size.Height : size.Width), maxSize.Width),
                      Math.Max(Convert.ToInt32(isVertical ? size.Width : size.Height), maxSize.Width)
                  );
              }
  
      using(var bmp = new Bitmap(maxSize.Width, maxSize.Height))
      {
          using(var gfx = Graphics.FromImage(bmp))
          {
              gfx.CompositingMode = CompositingMode.SourceCopy;
              gfx.CompositingQuality = CompositingQuality.HighQuality;
              gfx.SmoothingMode = SmoothingMode.HighQuality;
              gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
  
              var rect = new RectangleF(new PointF(0,0), maxSize);
              gfx.FillRectangle(new SolidBrush(bc), rect);
              gfx.DrawString(strings[textIndex], font, new SolidBrush(fc), rect, fmt);
          }
          bmp.Save(Response.OutputStream, ImageFormat.Png);
      }
      return new EmptyResult();
  }
  </code></pre>