2010-01-15 43 views
47

任何人都可以指导如何从输入文本生成图像。图片可能有任何扩展名并不重要。在影像上呈现文本如何在运行时从文本生成图像

+0

你的意思是像你这样的形象会从屏幕捕捉得到处置和引进分钟大小参数的?当然,*一些*格式/扩展会比其他格式更好。 – pavium 2010-01-15 08:52:49

+0

你的意思是什么样的文本输入? – 2010-01-15 08:53:06

+0

不,它不是屏幕截图,我们有输入文本框,我们正在使用C# – Ravia 2010-01-15 09:06:45

回答

123

好吧,假设你想绘制在C#中的图像上的绳子,你将需要在这里使用System.Drawing命名空间:

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; 

} 

此代码将先测量串,然后创建一个正确大小的图像。

如果你想保存这个函数的返回值,只需调用返回图像的Save方法即可。

+6

行“图像img =新位图(0,0);”,不起作用:您不能创建一个0大小的图像。将其更改为“新的位图(1,1)”,它的工作原理。 – neminem 2011-11-29 22:37:46

+3

如果在'drawing.DrawString(text,font,textBrush,0,0)'行之前添加'drawing.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;',则会获得更平滑的反锯齿文本。 – LoneBunny 2017-06-03 02:08:20

3

使用imagemagick(在服务器上)

既然你是在C#中,你也可以使用直接位图和字体操纵的.NET类(使用类,如:System.Drawing.BitmapSystem.Drawing.Graphics

3

我刚刚将此answer中提到的这种方法转换为VB.NET方法。也许这有助于某人。

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 

编辑:固定错字。

+0

谢谢弗雷迪,你为我节省了很多精力。 – BedfordNYGuy 2016-10-21 16:26:50

1

F#版本:


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 
3

感谢Kazar。以前的答案的略有改善使用使用使用后的图像/图形对象的

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; 
    } 
相关问题