Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位图图形:在磁盘上保存时没有绘制字符串-在memorystream中工作_C#_Asp.net Mvc_Bitmap_Drawstring - Fatal编程技术网

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);