Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2507
  • Last Modified:

How do I set the size for Graphics DrawString

Refer to code snippet. The Bitmap Size is set as follows:  Bitmap(500, 50);
The string I am drawing is DateTime.Now.ToShortTimeString()
I want to auto-resize my bitmap canvas/imagesize to allow for the actual lentgh of my string.
If I replace DateTime.Now.ToShortTimeString() with VeryLongTextString (unknown length)
eg. g.DrawString(VeryLongTextString, new Font("Arial", 32), Brushes.Red, new PointF(0, 0));
How do I Get around the limitations set by Bitmap(500, 50);
I don't want to necessarily resize or stretch the image, but instead change the canvas or image size to match the "content"
Bitmap bmp = new Bitmap(500, 50);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.White, 0, 0, 500, 50);
g.DrawString(DateTime.Now.ToShortTimeString(), new Font("Arial", 32), Brushes.Red, new PointF(0, 0));

Open in new window

0
andrejonker
Asked:
andrejonker
  • 2
3 Solutions
 
tcullerCommented:
You can use g.MeasureString(String, Font). This returns a SizeF object (a Size with float dimensions instead of integer). Just remember that you need to store the String beforehand; otherwise, two consecutive calls to DateTime.Now.ToShortTimeString() will yield differetn results. Here's an example, expanding on your code, presented in the following code snippet.

Hope it helps,
Nate
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(500, 50);
System.Drawing.Graphics gfx = System.Drawing.Graphics.FromImage(bmp);
 
System.String shortDate = System.DateTime.Now.ToShortDateTimeString();
System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 32F);
 
gfx.Clear(System.Drawing.Color.White); // This fills the whole bitmap with white, instead of manualy filling a rectangle
gfx.DrawString(shortDate, drawFont, System.Drawing.Brushes.Red, new System.Drawing.PointF(0f, 0f));
System.Drawing.SizeF dateSize = gfx.MeasureString(shortDate, drawFont);

Open in new window

0
 
gazzzzzzerCommented:
I agree that the MeasureString method provided by the Graphics Class should help you with your problem.

I have included an example to show how you could use this and increase the Canvas size as needed.
            Bitmap bmp = new Bitmap(500, 50);
            Graphics g = Graphics.FromImage(bmp);
            
            string shortDate = DateTime.Now.ToShortDateString();
            Font drawFont = new Font("Arial", 32F);
            SizeF dateSize = g.MeasureString(shortDate, drawFont);
 
            bmp = new Bitmap(bmp, Convert.ToInt32(dateSize.Width), Convert.ToInt32(dateSize.Height));
            g = Graphics.FromImage(bmp);
 
            g.FillRectangle(Brushes.White, 0, 0, 500, 50);
            g.DrawString(shortDate, drawFont, Brushes.Red, new PointF(0, 0));
 
// Continue to use the g and bmp param as required

Open in new window

0
 
gazzzzzzerCommented:
Sorry , you do not need or unlikely to want the line : g.FillRectangle(Brushes.White, 0, 0, 500, 50);

Here is the updated code:
            Bitmap bmp = new Bitmap(500, 50);
            Graphics g = Graphics.FromImage(bmp);
            
            string shortDate = DateTime.Now.ToShortDateString();
            Font drawFont = new Font("Arial", 32F);
            SizeF dateSize = g.MeasureString(shortDate, drawFont);
 
            bmp = new Bitmap(bmp, Convert.ToInt32(dateSize.Width), Convert.ToInt32(dateSize.Height));
            g = Graphics.FromImage(bmp);
 
            g.DrawString(shortDate, drawFont, Brushes.Red, new PointF(0, 0));
 
// Continue to use the g and bmp param as required

Open in new window

0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now