C# 位图图形:在磁盘上保存时没有绘制字符串-在memorystream中工作
我正在使用C# 位图图形:在磁盘上保存时没有绘制字符串-在memorystream中工作,c#,asp.net-mvc,bitmap,drawstring,C#,Asp.net Mvc,Bitmap,Drawstring,我正在使用Bitmap对象,使用Drawing.Graphics创建PNG图片。我创建一个位图,插入一个背景图像并绘制一些字符串 现在,当我将图像保存到磁盘上时,文件中没有我的字符串 我在ASP.NET MVC中执行此操作,这是我的控制器签名: [AcceptVerbs(HttpVerbs.Get)] public string GetNewsletterPicture(string headline, string tagline) 当我不将映像保存在磁盘上,而是从内存流返回
Bitmap
对象,使用Drawing.Graphics
创建PNG图片。我创建一个位图,插入一个背景图像并绘制一些字符串
现在,当我将图像保存到磁盘上时,文件中没有我的字符串强>
我在ASP.NET MVC中执行此操作,这是我的控制器签名:
[AcceptVerbs(HttpVerbs.Get)]
public string GetNewsletterPicture(string headline, string tagline)
当我不将映像保存在磁盘上,而是从内存流
返回FileStreamResult
时,映像看起来非常完美
因此,当我将图像保存到磁盘时,字符串不知何故被“遗忘”了
有什么想法吗
我的代码:
ColorConverter converter = new ColorConverter();
Color textColor = (Color)converter.ConvertFromString("#FF58595B");
int width = 598;
int height = 77;
int offSet = 40;
int shadowOffset = 1;
var bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp))
{
g.Clear(Color.LightGray);
Image backgroundImg = new Bitmap(Server.MapPath("~/Static/Images/bgimg.png"));
g.DrawImage(backgroundImg,0,0);
StringFormat sf= new StringFormat();
sf.Alignment = StringAlignment.Center;
var rectangleTop = new RectangleF(0, 0, width, height);
var rectangleTopShadowHack = new RectangleF(shadowOffset, shadowOffset, width + shadowOffset, height + shadowOffset);
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
// only show headline and center it
if (!string.IsNullOrEmpty(tagline))
{
var rectangleBottomShadowHack = new RectangleF(shadowOffset, offSet + shadowOffset, width + shadowOffset, height - offSet + shadowOffset);
var rectangleBottom = new RectangleF(0, offSet, width, height - offSet);
g.DrawString(tagline, new Font("Verdana", 18), new SolidBrush(Color.White), rectangleBottomShadowHack, sf);
g.DrawString(tagline, new Font("Verdana", 18), new SolidBrush(textColor), rectangleBottom, sf);
}
else
{
sf.LineAlignment = StringAlignment.Center;
}
g.DrawString(headline, GetFont("Sentinel-Bold", 28, FontStyle.Bold), new SolidBrush(Color.White), rectangleTopShadowHack, sf);
g.DrawString(headline, GetFont("Sentinel-Bold", 28, FontStyle.Bold), new SolidBrush(textColor), rectangleTop, sf);
g.Save();
var fileName = Guid.NewGuid().ToString() + ".png";
var path = Server.MapPath("~/Static/Previews/" + fileName);
bmp.Save(path, ImageFormat.Png);
return fileName;
如果有疑问,图片上未保存的是g.抽绳
新尝试(仍不工作):
我不能确定,但看起来您可能把
g.Save()
与g.Flush()
混淆了
您需要调用
g.Flush(FlushIntention.Sync)
而不是g.Save()
。您可能还应该在using块之外调用bmp.Save():
var bmp = new Bitmap(width, height);
using (Graphics g = Graphics.FromImage(bmp))
{
//...
g.Flush(FlushIntention.Sync);
}
var fileName = Guid.NewGuid().ToString() + ".png";
var path = Server.MapPath("~/Static/Previews/" + fileName);
bmp.Save(path, ImageFormat.Png)
Save()
用于保存当前图形状态,以便您可以修改它,然后在以后恢复它:
GraphicsState oldState = g.Save();
// Make some changes to the graphics state...
g.Restore(oldState);
另一方面,
Flush()
用于强制图形对象完成任何挂起的操作。通过将FlushIntention.Sync
作为参数传递,Flush()
在刷新完成之前不会返回。我刚刚尝试过这样做。。我也试过不用g.Save()-我也有同样的问题。我应该不使用g.Save()吗?代码段中没有比您看到的更多的内容:-)无论如何,没有字符串仍然是不幸的。您可能还应该在using块之外调用bmp.Save()。请看我上面的编辑。谢谢。我刚刚尝试过这个(见我在原始帖子中的新尝试)。不过还是没有运气!非常感谢您理解save/flush!只是想澄清一下,您得到的新文件(我假设您正在清除Static/Previews文件夹,这样就不会有混淆的危险)除了字符串之外,还有所有的图形调整?
GraphicsState oldState = g.Save();
// Make some changes to the graphics state...
g.Restore(oldState);