从响应中获取图像

时间:2015-03-03 20:00:35

标签: c# asp.net

我创建了一个生成位图的类(Draw.aspx)并在请求响应中返回它:

    Response.ContentType = "image/png";
    bitmap.Save(Response.OutputStream, ImageFormat.Png);

一切都很好,当我在我的网络浏览器中运行Draw.aspx它显示生成的图像,我可以将它保存在我的硬盘上等...

现在我想从另一个站点(〜/ default.aspx)调用此请求,并从那里将此图像保存到服务器(例如image.png)或在网站中使用它。我试图运行这段代码,但问题是我得到了Draw.aspx的.html部分,而不仅仅是.png:

    String inputImage = Server.MapPath("Draw.aspx");
    String outputImage = Server.MapPath("image.png");

    WebRequest webRequest = WebRequest.Create(inputImage);
    WebRequest.Create(inputImage);

    webRequest.Method = "GET";
    webRequest.ContentType = "image/png; encoding='utf-8'";

    WebResponse webResponse = webRequest.GetResponse();

    StreamReader oReader = new StreamReader(webResponse.GetResponseStream(), Encoding.UTF8);
    StreamWriter oWriter = new StreamWriter(outputImage);

    oWriter.Write(oReader.ReadToEnd());

什么image.png文件包含(而不是实际图像):

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

我一直在努力解决这个问题几个小时,但似乎没有什么工作正常,我认为我可能会误解请求回复是如何工作的。

我真的很感激任何帮助:)

1 个答案:

答案 0 :(得分:1)

您正在尝试下载图片,因此请使用图像对象!

ImageFeeder.ashx(注意:这就是我所谓的文件,它会吐出图像。相应地重命名):

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

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

public class ImageFeeder : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/png";
        context.Response.Clear();
        context.Response.BufferOutput = true;

        MemoryStream m = new MemoryStream();
        Image i = Image.FromFile(@"C:\Path\to\image.PNG");
        i.Save(m, System.Drawing.Imaging.ImageFormat.Png);

        context.Response.BinaryWrite(m.ToArray());
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

然后在您的其他页面中,只使用图像对象。例如,从默认的aspx表单页面开始:

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

在代码隐藏中创建一个图像,并用它做任何你想做的事情。例如:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Image i = new Image();
        i.ImageUrl = "ImageFeeder.ashx";
        // Now do whatever you want with it.
        form1.Controls.Add(i);

    }
}

图像将插入到表单标记内的div之后。由于它是一个图像对象,你可以随心所欲地做任何事情......显示它,保存它等等。

这很容易!

修改 保存图像稍微困难一点,但不是很多。首先,您需要一个WebClient对象,然后使用A:您的图像输送器的完整URL下载文件,B:您想要保存的绝对路径。让我们假设您在特殊端口上运行localhost(就像在VS中开发一样),并且您希望将映像转储到与其他所有目录相同的目录中。您在代码隐藏中最终得到了这个:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        WebClient wc = new WebClient();
        wc.DownloadFile("http://localhost:61579/ImageFeeder.ashx", Path.Combine(Server.MapPath("."), "myimage.png"));
    }
}

显然,您还需要所有using语句。