Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How do I set the size for Graphics DrawString

Posted on 2009-05-15
3
Medium Priority
?
2,468 Views
Last Modified: 2013-12-17
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
Comment
Question by:andrejonker
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 9

Accepted Solution

by:
tculler earned 800 total points
ID: 24397590
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
 
LVL 5

Assisted Solution

by:gazzzzzzer
gazzzzzzer earned 1200 total points
ID: 24404106
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
 
LVL 5

Assisted Solution

by:gazzzzzzer
gazzzzzzer earned 1200 total points
ID: 24404123
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

Featured Post

Major Serverless Shift

Comparison of major players like AWS, Microsoft Azure, IBM Bluemix, and Google Cloud Platform

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
This article aims to explain the working of CircularLogArchiver. This tool was designed to solve the buildup of log file in cases where systems do not support circular logging or where circular logging is not enabled
In this video, Percona Solution Engineer Dimitri Vanoverbeke discusses why you want to use at least three nodes in a database cluster. To discuss how Percona Consulting can help with your design and architecture needs for your database and infras…
In response to a need for security and privacy, and to continue fostering an environment members can turn to for support, solutions, and education, Experts Exchange has created anonymous question capabilities. This new feature is available to our Pr…

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question