如何绑定一个内存流到asp:image控件?

kcwpcxri  于 2023-03-09  发布在  .NET
关注(0)|答案(8)|浏览(128)

是否有办法将MemoryStream绑定到asp:image控件?

lsmepo6l

lsmepo6l1#

最好创建一个返回图像的HttpHandler。然后将asp:Image上的ImageUrl属性绑定到HttpHandler的url。
下面是一些代码。
首先创建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);
   }
}

接下来,只需在使用asp:Image的aspx页面中调用它。

<%@ 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>

就是这样。

pw9qyyiw

pw9qyyiw2#

处理程序可以像其他请求一样接受url参数,所以你不用把<asp:image/>链接到image.ashx,而是把它设置为image.ashx?ImageID=[Your image ID here]

pn9klfpd

pn9klfpd3#

我假设您需要从www.example.com生成动态图像asp.net,您可能运气不错http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449
Hanselman最近在博客上写了这个

5t7ly7z5

5t7ly7z54#

@威尔和本·格里斯沃尔德:请使用“image. ashx”而不是“image. aspx”。
它比完整的ASP.NET页更轻量级,并且它是专门设计来处理text/html以外的内容类型的。

vmjh9lq9

vmjh9lq95#

虽然将MemoryStream数据绑定到图像是不可能的,但可以使用标签/GenericControl、一些代码和data URI scheme将图像嵌入到页面中,但这种方法存在严重问题:
缺点

  • 嵌入的内容必须在进行更改之前提取和解码,然后重新编码和重新嵌入。
  • 不支持Cookie。
  • 嵌入超过一次的信息将作为包含文件的一部分重新下载,因此不会从浏览器的缓存中受益。
  • 浏览器可以限制URI长度,从而创建有效的最大数据大小。例如,Opera以前版本的URI限制为4kB,IE8 Beta 1的限制为32 kB。
  • 数据是作为一个简单的流包含的,许多处理环境(如web浏览器)可能不支持使用容器(如multipart/alternative或message/rfc 822)来提供更大的复杂性,如元数据、数据压缩或内容协商。
  • 微软的IE浏览器,从第7版(2008年第二季度市场占有率约70%),缺乏支持。

更好的方法是使用一个单独的“Image.aspx”页面来获取和输出你的MemoryStream,有点像我在开始学习www.example.com时创建的相册软件ASP.net:
(Don't laugh, that was my first attempt at ASP.net :-)
编辑:同意ASHX,上面的代码只是展示一个示例实现。当我更新相册时,它将使用ASHX。

b5lpy0ml

b5lpy0ml6#

您可以使用Telerik的BinaryImage控件来实现ASP.NET。
更多信息请点击这里:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

798qvoo8

798qvoo87#

没有。
但是你可以创建一个特殊的页面来流式传输图像,首先,你设置图像的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();
wgmfuz8q

wgmfuz8q8#

对我来说,有必要在@Page中添加“buffer=“false”。否则我会一直得到相同的图片...

相关问题