How to create an image from text on the fly at runtime

Can anyone describe how to generate an image from the input text. The image may have any extension, it does not matter.

+59
c # text image drawing
Jan 15 '10 at 8:48
source share
6 answers

Well, if you want to draw a string on an image in C #, you will need to use the System.Drawing namespace here:

private Image DrawText(String text, Font font, Color textColor, Color backColor) { //first, create a dummy bitmap just to get a graphics object Image img = new Bitmap(1, 1); Graphics drawing = Graphics.FromImage(img); //measure the string to see how big the image needs to be SizeF textSize = drawing.MeasureString(text, font); //free up the dummy image and old graphics object img.Dispose(); drawing.Dispose(); //create a new image of the right size img = new Bitmap((int) textSize.Width, (int)textSize.Height); drawing = Graphics.FromImage(img); //paint the background drawing.Clear(backColor); //create a brush for the text Brush textBrush = new SolidBrush(textColor); drawing.DrawString(text, font, textBrush, 0, 0); drawing.Save(); textBrush.Dispose(); drawing.Dispose(); return img; } 

This code will measure the string first and then create the image of the correct size.

If you want to save the return of this function, just call the Save method of the returned image.

+149
Jan 15 '10 at 9:19
source share

Thanks, Qazar. A slight improvement on the previous response to using USING to recycle images / graphics after use and introducing a minimum param size

  private Image DrawTextImage(String currencyCode, Font font, Color textColor, Color backColor) { return DrawTextImage(currencyCode, font, textColor, backColor, Size.Empty); } private Image DrawTextImage(String currencyCode, Font font, Color textColor, Color backColor, Size minSize) { //first, create a dummy bitmap just to get a graphics object SizeF textSize; using (Image img = new Bitmap(1, 1)) { using (Graphics drawing = Graphics.FromImage(img)) { //measure the string to see how big the image needs to be textSize = drawing.MeasureString(currencyCode, font); if (!minSize.IsEmpty) { textSize.Width = textSize.Width > minSize.Width ? textSize.Width : minSize.Width; textSize.Height = textSize.Height > minSize.Height ? textSize.Height : minSize.Height; } } } //create a new image of the right size Image retImg = new Bitmap((int)textSize.Width, (int)textSize.Height); using (var drawing = Graphics.FromImage(retImg)) { //paint the background drawing.Clear(backColor); //create a brush for the text using (Brush textBrush = new SolidBrush(textColor)) { drawing.DrawString(currencyCode, font, textBrush, 0, 0); drawing.Save(); } } return retImg; } 
+8
Jun 27 '16 at 3:49 on
source share

use imagemagick to render text on images (on the server)

Since you are in C #, you can also directly use .Net classes to work with bitmaps and fonts (with classes such as: System.Drawing.Bitmap and System.Drawing.Graphics ).

+3
Jan 15 '10 at 9:07
source share

I translated this method mentioned in this answer to the VB.NET method. Maybe this helps someone.

 Public Function DrawText(ByVal text As String, ByRef font As Font, ByRef textColor As Color, ByRef backColor As Color) As Image ' first, create a dummy bitmap just to get a graphics object Dim img As Image = New Bitmap(1, 1) Dim drawing As Graphics = Graphics.FromImage(img) ' measure the string to see how big the image needs to be Dim textSize As SizeF = drawing.MeasureString(Text, Font) ' free up the dummy image and old graphics object img.Dispose() drawing.Dispose() ' create a new image of the right size img = New Bitmap(CType(textSize.Width, Integer), CType(textSize.Height, Integer)) drawing = Graphics.FromImage(img) ' paint the background drawing.Clear(BackColor) ' create a brush for the text Dim textBrush As Brush = New SolidBrush(textColor) drawing.DrawString(text, font, textBrush, 0, 0) drawing.Save() textBrush.Dispose() drawing.Dispose() Return img End Function 

Change Typo fixed.

+3
Oct 27 '15 at 23:53 on
source share

F# version:

 open System.Drawing let drawText text font textColor backColor = let size = use dummyImg = new Bitmap(1, 1) use drawing = Graphics.FromImage(dummyImg) drawing.MeasureString(text, font) let img = new Bitmap((int size.Width), (int size.Height)) use drawing = Graphics.FromImage(img) use textBrush = new SolidBrush(textColor) do drawing.Clear(backColor) drawing.DrawString(text, font, textBrush, PointF()) drawing.Save() |> ignore img 
+1
Feb 26 '16 at 13:06
source share

Here is the version of Casar’s answer from Panayiotis with additional parameters and documentation, suitable for adding to the library class.

 /// <summary> /// Creates an image containing the given text. /// NOTE: the image should be disposed after use. /// </summary> /// <param name="text">Text to draw</param> /// <param name="fontOptional">Font to use, defaults to Control.DefaultFont</param> /// <param name="textColorOptional">Text color, defaults to Black</param> /// <param name="backColorOptional">Background color, defaults to white</param> /// <param name="minSizeOptional">Minimum image size, defaults the size required to display the text</param> /// <returns>The image containing the text, which should be disposed after use</returns> public static Image DrawText(string text, Font fontOptional=null, Color? textColorOptional=null, Color? backColorOptional=null, Size? minSizeOptional=null) { Font font = Control.DefaultFont; if (fontOptional != null) font = fontOptional; Color textColor = Color.Black; if (textColorOptional != null) textColor = (Color)textColorOptional; Color backColor = Color.White; if (backColorOptional != null) backColor = (Color)backColorOptional; Size minSize = Size.Empty; if (minSizeOptional != null) minSize = (Size)minSizeOptional; //first, create a dummy bitmap just to get a graphics object SizeF textSize; using (Image img = new Bitmap(1, 1)) { using (Graphics drawing = Graphics.FromImage(img)) { //measure the string to see how big the image needs to be textSize = drawing.MeasureString(text, font); if (!minSize.IsEmpty) { textSize.Width = textSize.Width > minSize.Width ? textSize.Width : minSize.Width; textSize.Height = textSize.Height > minSize.Height ? textSize.Height : minSize.Height; } } } //create a new image of the right size Image retImg = new Bitmap((int)textSize.Width, (int)textSize.Height); using (var drawing = Graphics.FromImage(retImg)) { //paint the background drawing.Clear(backColor); //create a brush for the text using (Brush textBrush = new SolidBrush(textColor)) { drawing.DrawString(text, font, textBrush, 0, 0); drawing.Save(); } } return retImg; } 
+1
Jul 26 '19 at 16:17
source share



All Articles