2012-01-19 42 views
16

Estoy usando asp.net mvc3. Estoy haciendo un mapa de bits usando texto por system.drawing. Quiero
para enviar esa imagen desde mi controlador a mi vista en VIEWDATA, pero en mi opinión no puedo analizar VIEWDATA correctamente.Enviar imagen desde el controlador a la vista En MVC3

Este es el código del controlador:

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

La vista llamando a la viewdata se parece a esto

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

Compruebe el código Sepa – Agha

+1

como este en Ver Página – Agha

Respuesta

15

me gustaría recomendar que escribir el resultado de acciones personalizadas para no contaminar su acción del controlador con completamente inútil y aburrido GDI + infraestructura de código:

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

y luego simplemente definir una acción de controlador que devolverá este resultado acción personalizada:

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

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

y desde el interior de algunas vistas (~/Views/Home/Index.cshtml en mi ejemplo) se podría hacer referencia a la acción que va a generar dinámicamente la imagen para usted:

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

Otra posibilidad si no desea crear una acción adicional para construir el la imagen es usar el Data URI scheme que básicamente le permite incrustar la imagen como datos de Base64 directamente en el HTML. Una advertencia con esto es que no todos los navegadores lo admiten y, además de eso, hace que sus páginas HTML sean mucho más grandes.

+0

@Darin Podría, por favor, dígame si no es un proyecto de MVC y si no hay ' contexto' en ese caso, cómo enviarlo a la página Razor View ... Consulte http://stackoverflow.com/questions/33361412/sending-image-from-rest-service-to-razor-view-page – Lara

2

Ha tratado ContentResult.

Puede intentar algo como siguiente (no verificado)

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

Si no necesita estar en ViewData (no estoy seguro si podrá hacerlo en ViewData porque cada recurso (imagen, flash, la página misma) tiene un ContentType que no cambia en . la solicitud actual

Sin embargo, puede intentar esto en su controlador:

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

en su opinión, es necesario llamar al controlador/Acción:

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

Muchas gracias:)) – 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; 
} 
Cuestiones relacionadas