代码之家  ›  专栏  ›  技术社区  ›  NealWalters

使用C System.Drawing/DrawString将图像调整为图像中的文本

  •  2
  • NealWalters  · 技术社区  · 14 年前

    我想取一个字符串和一个指定的字体,并创建一个在框中包含该文本的图形图像,在该图像中,框会根据文本调整大小。

    我得到了下面的代码,但它在做任何其他事情之前调整了盒子的大小。 是否有方法调整图像大小以适应文本(我可能需要添加几个像素的小边框)。

    另外,如果我想让弦居中的话,我也不确定为什么我需要传递x,y坐标。

      //Sample calls to function below 
            renderImage("Hello World", "Arial", 12, "test12.png");
            renderImage("Hello", "Arial", 16, "test16.png");
            renderImage("Peace Out", "Arial", 24, "test24.png");
    
    
    static void renderImage(string text, string fontName, string filename, int fontsize) 
    {
    
        {
            System.Drawing.Bitmap objBMP = null;
            System.Drawing.Graphics objGraphics = null;
            System.Drawing.Font objFont = null;
    
            // Create new image - bitmap
            objBMP = new Bitmap(531, 90);
    
            // Create a graphics object to work with from the BMP
            objGraphics = System.Drawing.Graphics.FromImage(objBMP);
    
            // Fill the image with background color
            objGraphics.Clear(Color.Yellow);
    
            // Set anti-aliasing for text to make it better looking
            objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    
            // Configure font to use for text
            objFont = new Font(fontName, fontsize, FontStyle.Bold);
    
            // Try StringFormat 
            StringFormat objStringFormat = new StringFormat();
            objStringFormat.Alignment = StringAlignment.Center;
            objStringFormat.LineAlignment = StringAlignment.Center;
    
    
            // Write out the text
            objGraphics.DrawString(text, objFont, Brushes.Black, 1, 1, objStringFormat);
    
    
      // Set the content type and return the image
            objBMP.Save(filename, ImageFormat.Png);
    
        }
    

    更新:

    让它根据答案工作,但有没有更有效的方法:

    static void Main(string[] args)
    {
        renderImage("Hello World", "Arial", 12, "test12.png");
        renderImage("Hello", "Arial", 16, "test16.png");
        renderImage("Peace Out", "Arial", 24, "test24.png");
    }
    
    static void renderImage(string text, string fontName, int fontSize, string filename) 
    {
    
        {
            System.Drawing.Bitmap objBMP = null;
            System.Drawing.Graphics objGraphics = null;
            System.Drawing.Bitmap objBMPTemp = null;
            System.Drawing.Graphics objGraphicsTemp = null;
            System.Drawing.Font objFont = null;
    
            // Configure font to use for text
            objFont = new Font(fontName, fontSize, FontStyle.Bold);
    
            // Create new image - bitmap
            SizeF objSizeF = new SizeF();
            objBMPTemp = new Bitmap(100, 100); // some temp dummy size 
    
            // Create a graphics object to work with from the BMP
            objGraphicsTemp = System.Drawing.Graphics.FromImage(objBMPTemp);
    
            objSizeF = objGraphicsTemp.MeasureString(text, objFont);
            objBMP = new Bitmap((int)objSizeF.Width, (int)objSizeF.Height); 
            objGraphics = System.Drawing.Graphics.FromImage(objBMP); 
    
    
    
            // Fill the image with background color
            objGraphics.Clear(Color.Yellow);
    
            // Set anti-aliasing for text to make it better looking
            objGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    
    
            // Try StringFormat 
            //StringFormat objStringFormat = new StringFormat();
            //objStringFormat.Alignment = StringAlignment.Center;
            //objStringFormat.LineAlignment = StringAlignment.Center;
            //objStringFormat.FormatFlags
    
    
    
            // Write out the text
            //objGraphics.DrawRectangle(new Pen(Color.Cyan, 1), 0.0F, 0.0F, objSizeF.Width, objSizeF.Height);
            objGraphics.DrawString(text, objFont, Brushes.Black, 1, 1);
            //objGraphics.DrawString(text, objFont, Brushes.Black, 
    
    
    
            // Set the content type and return the image
            objBMP.Save(filename, ImageFormat.Png);
    
    
            // Kill our objects
            objFont.Dispose();
            objGraphics.Dispose();
            objBMP.Dispose();
        }
    
    }
    
    1 回复  |  直到 14 年前
        1
  •  4
  •   Klaus Byskov Pedersen    14 年前