2013-08-07 1 views
0

Я создаю PNG-изображение, используя объект Bitmap, используя Drawing.Graphics. Я создаю растровое изображение, вставляю фоновое изображение и рисую несколько строк.Графика растрового изображения: при сохранении на диске нет выделенных строк - работает, когда memystream

Теперь, когда я сохраняю изображение на диске, у файлов нет моих строк!

Я делаю это в ASP.NET MVC, где это мой контроллеры подписи:

[AcceptVerbs(HttpVerbs.Get)] 
    public string GetNewsletterPicture(string headline, string tagline) 

Когда я не сохранить изображение на диске, а вместо этого возвращает FileStreamResult из MemoryStream, то изображение выглядит отлично.

Так что есть некоторая проблема, что, когда я сохраняю изображение на диск, строки как-то «забыты».

Любые идеи?

Мой код:

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.DrawString, которая не сохраняется на картинке.

NEW atttempt (до сих пор не работает):

[AcceptVerbs(HttpVerbs.Get)] 
     public string GetNewsletterPicture(string headline, string tagline) 
     { 
      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.Flush(FlushIntention.Sync); 
      } 

      var fileName = Guid.NewGuid().ToString() + ".png"; 
      var path = Server.MapPath("~/Static/Previews/" + fileName); 
      bmp.Save(path, ImageFormat.Png); 

      return fileName; 


      //MemoryStream stm = new MemoryStream(); 
      //bmp.Save(stm,System.Drawing.Imaging.ImageFormat.Png); 
      //stm.Position = 0; 

      //return new FileStreamResult(stm, "image/png"); 
     } 

ответ

1

Я не могу сказать точно, но это выглядит, как вы могли бы ввести в заблуждение g.Save() с g.Flush().

Необходимо позвонить по телефону g.Flush(FlushIntention.Sync) вместо g.Save(). Вы, вероятно, следует также назвать 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() не вернется, пока промывка не будет завершена.

+0

Я просто пытался это сделать. И я также пробовал без g.Save() - У меня такая же проблема. Должен ли я использовать g.Save()? Больше нет фрагмента, чем вы можете видеть :-) Так или иначе, никаких строк, к сожалению, нет –

+0

Возможно, вы также должны вызвать bmp.Save() вне используемого блока. См. Мои правки выше. – lfalin

+0

Спасибо. Я просто попробовал это (см. Мою новую попытку в исходном посте). Тем не менее, удачи! Большое спасибо за понимание понимания save/flush! –

Смежные вопросы