bytearray для изображения asp.net - PullRequest
22 голосов
/ 15 ноября 2009

У меня есть байтовый массив, представляющий изображение. Я хочу представить изображение, хранящееся в этом байтовом массиве на странице aspx. Могу ли я сделать это, используя изображение или элемент управления imagemap? Если так - как? Если нет - какое решение?

Ответы [ 4 ]

35 голосов
/ 28 сентября 2012

Еще одна вещь, которую вы можете сделать быстрее: не использовать элемент управления asp.net Image и использовать базовый элемент img в HTML Поэтому на странице asp.net создайте элемент img с идентификатором img и runat, установленным на сервер.

Тогда вы могли бы сделать что-то вроде этого:

<img id="img" runat="server" alt=""/>

public DataRow ClaimPhotoRow { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
    img.Src = "data:image/jpg;base64," + Convert.ToBase64String((byte[])ClaimPhotoRow[0]);

}
21 голосов
/ 15 ноября 2009

Подумайте о том, как обычные изображения обрабатываются на веб-странице - на имя файла ссылается разметка, и браузер отправляет серверу отдельный запрос на этот файл.

Здесь применяется тот же принцип, за исключением того, что вместо ссылки на файл статического изображения вы можете обратиться к обработчику ASP.NET, который обслуживает байты изображения:

<img src="/imagehandler.ashx" />

Суть обработчика будет выглядеть примерно так:

public class ImageHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.OutputStream.Write(imageData, 0, imageData.Length);
        context.Response.ContentType = "image/JPEG";
    }
}

Вот (длинный) ресурс, который охватывает концепции создания HttpHander в ASP.NET.

Кроме того, как указывает Джоэл, подумайте, откуда байт-массив поступает, поскольку HttpHandler обслуживается в совершенно другом запросе, чем страница. На самом базовом уровне два запроса не знают друг о друге или не делятся какими-либо данными.

Распространенным решением этой проблемы является помещение данных изображения в кэш:

Guid id = Guid.NewGuid();
HttpRuntime.Cache.Add(id.ToString(), imageData);

И передать ключ HttpHandler в строке запроса, чтобы он мог извлечь его из кэша:

<img src="/imagehandler.ashx?img=<%=id%>" />
<!-- will print ...ashx?img=42a96c06-c5dd-488c-906f-cf20663d0a43 -->
4 голосов
/ 15 ноября 2009

Вы можете написать общий обработчик, который будет обслуживать картинку:

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

public class Picture : System.Web.IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        byte[] buffer = GetPictureFromSomewhere();
        context.Response.ContentType = "image/jpeg";
        context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    }

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

А затем вызвать его на странице aspx:

<asp:Image ID="pic" runat="server" ImageUrl="~/Picture.ashx" />
2 голосов
/ 24 августа 2012

Следующая статья отвечает на ваш вопрос: Авто-привязка байта [] к asp: Изображение

...