Я хочу взять строку и указанный шрифт и создать графическое изображение, содержащее этот текст в блоке, где размер блока изменяется в соответствии с текстом.
Я получил приведенный ниже код, но он масштабирует окно, прежде чем делать что-либо еще.
Есть ли способ изменить размер изображения, чтобы он соответствовал тексту (вероятно, мне нужно добавить небольшую рамку в несколько пикселей).
Кроме того, я не был уверен, зачем мне нужно передавать координаты 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();
}
}