2012-01-19 13 views
16

Używam asp.net mvc3. Robię bitmapę przy użyciu tekstu przez system.drawing. Chcę, aby
wysłać ten obraz z kontrolera do mojego widoku w VIEWDATA, ale moim zdaniem nie mogę poprawnie parsować VIEWDATA.Wysyłanie obrazu z kontrolera do widoku w MVC3

Jest to kod kontrolera:

public ActionResult About(string agha) 
     { 
      agha = "asgdjhagsdjgajdga"; 
      Color BackColor = Color.White; 
      String FontName = "Times New Roman"; 
      int FontSize = 25; 
      int Height = 50; 
      int Width = 700; 

      Bitmap bitmap = new Bitmap(Width, Height); 
      Graphics graphics = Graphics.FromImage(bitmap); 
      Color color = Color.Gray; ; 
      Font font = new Font(FontName, FontSize);   

      SolidBrush BrushBackColor = new SolidBrush(BackColor); 
      Pen BorderPen = new Pen(color); 

      Rectangle displayRectangle = new Rectangle(new Point(0, 0), new Size(Width - 1, Height - 1)); 

      graphics.FillRectangle(BrushBackColor, displayRectangle); 
      graphics.DrawRectangle(BorderPen, displayRectangle);    

      graphics.DrawString(agha,font,Brushes.Red, 0, 0); 
      ViewData["picture"] = bitmap;    

      return View(); 
     } 

Widok wywołanie ViewData wygląda to

<img src="@ViewData["picture"]." /> 
+0

sprawdzić kod wiedzieć – Agha

+1

tak na widoku strony – Agha

Odpowiedz

15

polecam piszesz wynik niestandardowych działań, aby uniknąć zanieczyszczających swoje działanie kontrolera z całkowicie bezużytecznym i nudnym GDI + infrastruktury kodu:

public class ImageResult : ActionResult 
{ 
    private readonly string _agha; 
    public ImageResult(string agha) 
    { 
     _agha = agha; 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     Color BackColor = Color.White; 
     String FontName = "Times New Roman"; 
     int FontSize = 25; 
     int Height = 50; 
     int Width = 700; 

     using (Bitmap bitmap = new Bitmap(Width, Height)) 
     using (Graphics graphics = Graphics.FromImage(bitmap)) 
     { 
      Color color = Color.Gray; 
      Font font = new Font(FontName, FontSize); 

      SolidBrush BrushBackColor = new SolidBrush(BackColor); 
      Pen BorderPen = new Pen(color); 

      Rectangle displayRectangle = new Rectangle(new Point(0, 0), new Size(Width - 1, Height - 1)); 

      graphics.FillRectangle(BrushBackColor, displayRectangle); 
      graphics.DrawRectangle(BorderPen, displayRectangle); 

      graphics.DrawString(_agha, font, Brushes.Red, 0, 0); 

      context.HttpContext.Response.ContentType = "image/jpg"; 
      bitmap.Save(context.HttpContext.Response.OutputStream, ImageFormat.Jpeg); 
     } 
    } 
} 

a następnie po prostu zdefiniować działania kontrolera, że ​​powróci ten wynik zwyczaj działanie:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    public ActionResult Image(string agha) 
    { 
     return new ImageResult(agha); 
    } 
} 

i od wewnątrz jakiegoś widzenia (~/Views/Home/Index.cshtml w moim przykładzie) można odwoływać się do działań, które będą dynamicznie wygenerować obraz dla Ciebie:

<img src="@Url.Action("Image", new { agha = "foo bar" })" alt="" /> 

Inna możliwość, jeśli nie chcesz, aby utworzyć dodatkowe działania, aby zbudować image to użycie funkcji Data URI scheme, która zasadniczo pozwala osadzić obraz jako dane Base64 bezpośrednio w kodzie HTML. Jedynym zastrzeżeniem jest to, że nie wszystkie przeglądarki obsługują to i ni oprócz tego sprawia, że ​​twoje strony HTML są znacznie większe.

+0

@Darin mógłbyś mi powiedzieć, jeśli nie jest to projekt MVC, a jeśli nie ma ' kontekst "w takim przypadku, jak wysłać go do strony Razor View .. Proszę spojrzeć na http://stackoverflow.com/questions/33361412/sending-image-z-zawiera-restauracja-do-razor-view-page – Lara

2

Czy próbowałeś ContentResult.

Można spróbować czegoś podobnego po (niezweryfikowany)

public ContentResult GetImage() 
     { 
      var content = new ContentResult(); 
      content.Content = "Image as String"; 
      content.ContentType = "image/jpg"; 
      return content; 
     } 
+0

http://zombie-programming.blogspot.com/ – Agha

12

Jeśli nie musi być w ViewData (nie jest pewne, czy będzie można to zrobić w ViewData, ponieważ każdy zasób (obraz, flash, sama strona) ma ContentType, który nie zmienia się w . obecny wniosek

można jednak spróbować tego w kontrolerze:

public ActionResult GenerateImage() { 
    FileContentResult result; 

    using(var memStream = new System.IO.MemoryStream()) { 
     bitmap.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     result = this.File(memStream.GetBuffer(), "image/jpeg"); 
    } 

    return result; 
} 

Państwa zdaniem, trzeba zadzwonić do kontrolera/działanie:

<img src='@Url.Action("GenerateImage")' alt="" /> 
+1

Wielkie dzięki:)) – Agha

1
public ContentResult GetImage() 
     { 
      var content = new ContentResult(); 
      content.Content = "Image as String"; 
      content.ContentType = "~image/jpg"; 
      return content; 
     } 
1
public ActionResult GenerateImage() { 
    FileContentResult result; 

    using(var memStream = new System.IO.MemoryStream()) { 
     bitmap.Save(memStream, System.Drawing.Imaging.ImageFormat.Jpeg); 
     result = this.File(memStream.GetBuffer(), "image/jpeg"); 
    } 

    return result; 
} 
Powiązane problemy