从响应中获取图像

本文关键字:图像 获取 响应 | 更新日期: 2024-09-27 01:35:56

我制作了一个类(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>

我已经试着解决这个问题几个小时了,但似乎什么都不起作用,我想我可能误解了请求响应的工作原理。

如果有任何帮助,我将不胜感激:)

从响应中获取图像

您正在尝试下载图像,所以请使用图像对象!

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);
    }
}

Image将插入到表单标记内的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语句。