Как связать MemoryStream с управлением asp:image?

Посмотрите здесь

Текущая реализация сохраняет массив целых объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне вы фактически просто возвращаете ссылку на существующий объект.

blockquote>

13
задан Community 10 September 2008 в 00:13
поделиться

6 ответов

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

7
ответ дан 1 December 2019 в 17:32
поделиться

Лучший выбор состоит в том, чтобы создать 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>

И это - это.

39
ответ дан 1 December 2019 в 17:32
поделиться

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

Hanselman, занесенный в блог об этом недавно http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

4
ответ дан 1 December 2019 в 17:32
поделиться

@Will и Ben Griswald: вместо "image.aspx" используют "image.ashx".

Это более легко, чем полная Страница ASP.Net, и это специально предназначено для обработки типов контента кроме текста/HTML.

2
ответ дан 1 December 2019 в 17:32
поделиться

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

Недостатки

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

лучший Подход должен использовать отдельного Page "Image.aspx", который берет и производит Ваш MemoryStream, отчасти как я сделал в своем программном обеспечении Photo Album, которое я создал, когда я начал изучать ASP.net:

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

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

1
ответ дан 1 December 2019 в 17:32
поделиться

Нет.

, Но можно создать специальную страницу для потоковой передачи того изображения. Во-первых, Вы устанавливаете 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();
0
ответ дан 1 December 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: