Как привязать MemoryStream к элементу управления изображениями asp:? - PullRequest
13 голосов
/ 06 сентября 2008

Есть ли способ привязать MemoryStream к asp: control image?

Ответы [ 8 ]

39 голосов
/ 06 сентября 2008

Лучше всего создать HttpHandler, который бы возвращал изображение. Затем привяжите свойство ImageUrl в asp: Image к URL-адресу HttpHandler.

Вот код.

Сначала создайте HttpHandler:

<%@ WebHandler Language="C#" Class="ImageHandler" %>

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

public class ImageHandler : IHttpHandler
{    
    public void ProcessRequest (HttpContext context)
    {
        context.Response.Clear();

        if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
        {
            int id = Int32.Parse(context.Request.QueryString["id"]);

            // Now you have the id, do what you want with it, to get the right image
            // More than likely, just pass it to the method, that builds the image
            Image image = GetImage(id);

            // Of course set this to whatever your format is of the image
            context.Response.ContentType = "image/jpeg";
            // Save the image to the OutputStream
            image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
        else
        {
            context.Response.ContentType = "text/html";
            context.Response.Write("<p>Need a valid id</p>");
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
   }

   private Image GetImage(int id)
   {
       // Not sure how you are building your MemoryStream
       // Once you have it, you just use the Image class to 
       // create the image from the stream.
       MemoryStream stream = new MemoryStream();
       return Image.FromStream(stream);
   }
}

Далее просто вызовите его на странице aspx, где вы используете asp: Image.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
        </div>
    </form>
</body>
</html>

И это все.

7 голосов
/ 06 сентября 2008

Обработчик может принять параметр url, как и любой другой запрос. Поэтому вместо того, чтобы связывать ваш <asp:image/> с image.ashx, вы должны установить его на image.ashx?ImageID=[Your image ID here].

4 голосов
/ 06 сентября 2008

Я предполагаю, что вам нужно генерировать динамические изображения из asp.net Вам может повезти http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Хансельман недавно писал об этом http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

2 голосов
/ 06 сентября 2008

@ Уилл и Бен Грисвальд: вместо «image.aspx» используйте «image.ashx».

Он более легкий, чем полноценная страница ASP.Net, и специально разработан для обработки типов контента, отличных от text / html.

1 голос
/ 28 ноября 2012

Вы можете использовать элемент управления BinaryImage Telerik для ASP.net.

Больше информации здесь: http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

1 голос
/ 06 сентября 2008

Хотя привязка данных MemoryStream к изображению невозможна, можно использовать Label / GenericControl, некоторый код и схему URI данных для встраивания изображений в страницы, но существуют серьезные проблемы с такой подход:

Недостатки

  • Внедренный контент должен быть извлечен и декодирован до внесения изменений, затем перекодирован и повторно внедрен после.
  • Файлы cookie не поддерживаются.
  • Информация, внедренная более одного раза, перезагружается как часть содержащего ее файла и, таким образом, не извлекает пользу из кэша браузера.
  • Браузеры могут ограничивать длины URI, создавая эффективный максимальный размер данных. Например, URI в предыдущих версиях Opera имели ограничения 4 КБ и 32 КБ для IE8 Beta 1 [необходимо цитирование]
  • Данные включены в виде простого потока, и многие среды обработки (например, веб-браузеры) могут не поддерживать использование контейнеров (таких как multipart / альтернатива или message / rfc822) для обеспечения большей сложности, такой как метаданные, сжатие данных или контент переговоры.
  • В Microsoft Internet Explorer, начиная с версии 7 (около 70% рынка по состоянию на второй квартал 2008 года), отсутствует поддержка.

Лучшим подходом является использование отдельной страницы «Image.aspx», которая берет и выводит ваш MemoryStream, как я делал в программном обеспечении для фотоальбома, которое я создал, когда начал изучать ASP.net:

.

(Не смейтесь, это была моя первая попытка ASP.net: -)

Редактировать: Согласен с ASHX, приведенный выше код просто для демонстрации одного примера реализации. Когда я зайду обновлять Фотоальбом, для этого будет использоваться ASHX.

0 голосов
/ 14 января 2013

Для меня было необходимо добавить "buffer =" false "в @Page. В противном случае я бы постоянно получал одно и то же изображение ...

0 голосов
/ 06 сентября 2008

Неа.

Но вы можете создать специальную страницу для потоковой передачи этого изображения. Сначала вы задаете URL-адрес изображения для страницы, которая выполняет потоковую передачу, включая некоторые параметры URL-адреса, которые позволяют вам знать, где получить изображение:

<img src="GetImage.aspx?filename=foo" ... />

в GetImage.aspx вы получаете имя файла (или что-то еще) из URL, загружаете изображение в ваш MemoryStream, а затем записываете содержимое этого потока памяти непосредственно в HttpResponse:

    response.Expires = 0;
    response.Buffer = false;
    response.Clear();
    response.ClearHeaders();
    response.ClearContent();
    response.ContentType = "image/jpeg";
    response.BinaryWrite(stream);
    response.Flush();
    response.Close();
...