C# 如何调整以编程方式创建的位图的大小以匹配其上绘制的文本?
我有下面的.ashx页面,它接受一些查询字符串参数,并返回一个包含指定文本的位图。 我的问题是,我目前只是手动将位图的初始大小设置为100 X 100,而我真正想要的是使位图刚好足够大,以包含写入其中的所有文本。 我该怎么做C# 如何调整以编程方式创建的位图的大小以匹配其上绘制的文本?,c#,asp.net,system.drawing,C#,Asp.net,System.drawing,我有下面的.ashx页面,它接受一些查询字符串参数,并返回一个包含指定文本的位图。 我的问题是,我目前只是手动将位图的初始大小设置为100 X 100,而我真正想要的是使位图刚好足够大,以包含写入其中的所有文本。 我该怎么做 public void ProcessRequest (HttpContext context) { context.Response.ContentType = "image/png"; string text = context.Request.
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "image/png";
string text = context.Request.QueryString["Text"];
//set FontName
string fontName;
if (context.Request.QueryString["FontName"] != null)
{
fontName = context.Request.QueryString["FontName"];
}
else
{
fontName = "Arial";
}
//Set FontSize
int fontEms;
if (context.Request.QueryString["FontSize"] != null)
{
string fontSize = context.Request.QueryString["FontSize"];
fontEms = Int32.Parse(fontSize);
}
else
{
fontEms = 12;
}
//Set Font Color
System.Drawing.Color color;
if (context.Request.QueryString["FontColor"] != null)
{
string fontColor = context.Request.QueryString["FontColor"];
color = System.Drawing.ColorTranslator.FromHtml(fontColor);
context.Response.Write(color.ToString());
}
else
{
color = System.Drawing.Color.Red;
}
using (System.Drawing.Text.PrivateFontCollection fnts = new System.Drawing.Text.PrivateFontCollection())
using (System.Drawing.FontFamily fntfam = new System.Drawing.FontFamily(fontName))
using (System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(color))
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(100, 100))
{
using (System.Drawing.Font fnt = new System.Drawing.Font(fntfam, fontEms))
{
fnts.AddFontFile(System.IO.Path.Combine(@"C:\Development\Fonts\", fontName));
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
graph.DrawString(text, fnt, brush, new System.Drawing.Point(0, 0));
string imgPath = System.IO.Path.Combine(@"C:\Development\MyPath\Images\Text", System.IO.Path.GetRandomFileName());
bmp.Save(imgPath);
context.Response.WriteFile(imgPath);
}
}
}
更新:
最后,我创建了一个比我需要的更大的位图,从该位图中获取图形,并使用MeasureString方法获取我将要写入的文本的大小,然后将位图的该部分裁剪成一个新的位图,如下所示
using (System.Drawing.Text.PrivateFontCollection fnts = new System.Drawing.Text.PrivateFontCollection())
using (System.Drawing.FontFamily fntfam = new System.Drawing.FontFamily(fontName))
using (System.Drawing.SolidBrush brush = new System.Drawing.SolidBrush(color))
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(500, 500))
{
using (System.Drawing.Font fnt = new System.Drawing.Font(fntfam, fontEms))
{
fnts.AddFontFile(System.IO.Path.Combine(@"C:\Development\Fonts\", fontName));
System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
System.Drawing.SizeF bmpSize = graph.MeasureString(text, fnt);
System.Drawing.Rectangle rect = new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), bmpSize.ToSize());
System.Drawing.Bitmap croppedBmp = bmp.Clone(rect, bmp.PixelFormat);
graph = System.Drawing.Graphics.FromImage(croppedBmp);
graph.DrawString(text, fnt, brush, new System.Drawing.Point(0, 0));
string imgPath = System.IO.Path.Combine(@"C:\Development\MyPath\Images\Text", System.IO.Path.GetRandomFileName());
croppedBmp.Save(imgPath);
context.Response.WriteFile(imgPath);
}
}
我想有一种方法可以使用指定的字体返回指定文本的大小
然后,您可以相应地调整图像的大小,或者相应地调整文本的大小,以使两者都适合
也许关注一下这一点会在某种程度上指导您,因为问题是如何调整文本大小,使其适合某个区域。你似乎希望做一些相似的东西,因此算法可能会启发你