2015-03-03 2 views
0

Я сделал класс (Draw.aspx), который генерирует битовый массив и возвращает его в ответ запроса:Получить изображение из ответа

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

Все работает хорошо, когда я бегу Draw.aspx в веб-браузере это показывает сгенерированное изображение, я могу сохранить его на своем жестком диске и т. д.

Теперь я хотел вызвать этот запрос с другого сайта (~/default.aspx) и оттуда сохранить это изображение на сервере (например, image.png) или использовать его на веб-сайте. Я попытался запустить этот код, но проблема в том, я получаю .html часть Draw.aspx вместо того, чтобы просто .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

Вы пытаетесь загрузить изображение, поэтому используйте изображение объекта!

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, находящегося внутри тега формы. Поскольку это объект изображения, вы можете делать все, что хотите, с ним ... отображать его, сохранять его и т. Д.

Это так просто!

EDIT: Сохранение изображения немного сложнее, но не очень. Сначала вам понадобится объект WebClient, затем загрузите файл, используя A: полный URL-адрес вашего фидера изображения, и B: абсолютный путь того, где вы хотите сохранить вещи. Предположим, вы работаете на локальном хосте на специальном порту (например, когда вы делаете что-то в 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 заявления, а также.

+0

Благодарим за отзыв. Раньше я использовал аналогичный код, но я отказался от него, потому что я хотел иметь контроль над сгенерированным изображением, и в этом примере он напрямую связан с Image (control). Что я могу сделать, если, например, я хотел показать его на сайте ** и ** сохранить его на сервере? –

+0

обновил ответ. Чтобы показать это и сохранить, просто объедините два метода, которые я предоставил. –

+0

Ваш ответ был действительно полезен!Я прочитаю немного больше о классах и методах, которые вы использовали, потому что, хотя они работают, у меня есть некоторые вопросы о том, как :) –

Смежные вопросы