Pergunta

Existe uma maneira de vincular um MemoryStream ao controle asp:image?

Foi útil?

Solução

Um manipulador pode aceitar um parâmetro url como qualquer outra solicitação.Então, em vez de vincular seu <asp:image/> para image.ashx você configuraria para image.ashx?ImageID=[Your image ID here].

Outras dicas

A melhor aposta é criar um HttpHandler que retorne a imagem.Em seguida, vincule a propriedade ImageUrl no asp:Image ao URL do HttpHandler.

Aqui está um código.

Primeiro crie o 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);
   }
}

Em seguida, basta chamá-lo dentro da sua página aspx onde você está usando o 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>

E é isso.

Estou assumindo que você precisa gerar imagens dinâmicas do ASP.NET, você pode estar com sortehttp://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman blogou sobre isso recentementehttp://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@Will e Ben Griswald:em vez de "image.aspx" use "image.ashx".

É mais leve que uma página ASP.Net completa e foi projetada especificamente para lidar com tipos de conteúdo diferentes de texto/html.

Embora não seja possível vincular um MemoryStream a uma imagem, pode ser possível usar um Label/GenericControl, algum código e o esquema de URI de dados para incorporar imagens em páginas, mas há problemas graves com essa abordagem:

Desvantagens

  • O conteúdo incorporado deve ser extraído e decodificado antes que as alterações possam ser feitas e, em seguida, recodificado e reincorporado posteriormente.
  • Cookies não são suportados.
  • As informações incorporadas mais de uma vez são baixadas novamente como parte do arquivo que as contém e, portanto, não se beneficiam do cache do navegador.
  • Os navegadores podem limitar os comprimentos de URI, criando um tamanho máximo efetivo de dados.Por exemplo, URIs em versões anteriores do Opera tinham limites de 4kB e 32kB para IE8 Beta 1.
  • Os dados são incluídos como um fluxo simples e muitos ambientes de processamento (como navegadores da Web) podem não suportar o uso de contêineres (como multipart/alternative ou message/rfc822) para fornecer maior complexidade, como metadados, compactação de dados ou negociação de conteúdo.
  • O Internet Explorer da Microsoft, até a versão 7 (cerca de 70% do mercado no segundo trimestre de 2008), carece de suporte.

A melhor abordagem é usar uma página "Image.aspx" separada que pega e gera seu MemoryStream, como fiz no software Photo Album que criei quando comecei a aprender ASP.net:

(Não ria, essa foi minha primeira tentativa no ASP.net :-)

Editar:Concordo com ASHX, o código acima é apenas para mostrar um exemplo de implementação.Quando eu vier atualizar o Álbum de Fotos, ele usará ASHX para isso.

Você pode usar o controle BinaryImage da Telerik para ASP.net.

Mais informações aqui:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

Não.

Mas você pode criar uma página especial para transmitir essa imagem.Primeiro, você define a URL da imagem para a página que realiza o streaming, incluindo alguns parâmetros de URL que permitem saber onde obter a imagem:

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

em GetImage.aspx, você obtém o nome do arquivo (ou qualquer outro) da URL, carrega a imagem em seu MemoryStream e, em seguida, grava o conteúdo desse fluxo de memória diretamente no HttpResponse:

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

Para mim foi necessário adicionar "buffer="false" ao @Page.Caso contrário, eu continuaria recebendo a mesma imagem o tempo todo...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top