Отправить изображение с контроллера для просмотра в MVC3 - PullRequest
17 голосов
/ 19 января 2012

Я использую asp.net mvc3. Я делаю растровое изображение, используя текст с помощью system.drawing. Я хочу
чтобы отправить это изображение с моего контроллера на мой взгляд в VIEWDATA, но, на мой взгляд, я не могу правильно проанализировать VIEWDATA.

Это код контроллера:

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

Представление, вызывающее данные представления, выглядит следующим образом

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

Ответы [ 5 ]

15 голосов
/ 19 января 2012

Я бы порекомендовал вам написать собственный результат действия, чтобы не загрязнять действие вашего контроллера совершенно бесполезным и скучным кодом инфраструктуры GDI +:

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

, а затем просто определите действие контроллера, которое будет возвращать этот результат пользовательского действия:

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

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

и из некоторого представления (~/Views/Home/Index.cshtml в моем примере) вы можете сослаться на действие, которое будет динамически генерировать для вас изображение:

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

Еще одна возможность, если вы не хотите создавать дополнительное действие для построения изображения, - это использовать схему URI данных , которая в основном позволяет встроить изображение в виде данных Base64 непосредственно в HTML. Одно предостережение в том, что не все браузеры поддерживают его, и, кроме того, он делает ваши HTML-страницы намного больше.

12 голосов
/ 19 января 2012

Если он не должен быть в ViewData (не уверен, сможете ли вы сделать это в ViewData, потому что каждый ресурс (изображение, flash, сама страница) имеет ContentType, который не изменяется в текущий запрос.

Однако, вы можете попробовать это в вашем контроллере:

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

На ваш взгляд, вам нужно вызвать контроллер / действие:

<img src='@Url.Action("GenerateImage")' alt="" />
2 голосов
/ 19 января 2012

Вы пробовали ContentResult.

Вы можете попробовать что-то вроде следующего (не проверено)

public ContentResult GetImage()
        {
            var content = new ContentResult();
            content.Content = "Image as String";
            content.ContentType = "image/jpg";
            return content;
        }
1 голос
/ 22 октября 2015
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;
}
1 голос
/ 12 октября 2015
public ContentResult GetImage()
        {
            var content = new ContentResult();
            content.Content = "Image as String";
            content.ContentType = "~image/jpg";
            return content;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...