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

13

ли способ привязать MemoryStream к элементу управления изображениями asp:?

спасибо всем за ваши ответы. Я также использовал httphandler для этой проблемы, но мне нужно немного больше, чем это. Я хочу передать параметр httphandler, который генерирует различные изображения в Grid, и разница будет предоставлена ​​по id строки. поэтому я должен передать параметр этому httphandler. это удобно? есть предложение? Ali Ersöz
imageresizing.net HttpModule делает это очень просто. Lilith River

Ваш Ответ

8   ответов
39

который бы возвращал изображение. Затем привяжите свойство 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>

И это все.

Есть ли способ сделать это без HttpHandler, у меня нет записи для создания обработчика в моем проекте » Imran Rizvi
7

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

Иimageresizing.net Библиотека делает это для вас. Lilith River
4

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

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

1

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

Недостатки

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

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

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

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

0

Но вы можете создать специальную страницу для потоковой передачи этого изображения. Сначала вы задаете 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

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

1

net.

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

2

@Will и Ben Griswald: вместо «image..ashx».

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

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