bytearray в изображение asp.net

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


person user181218    schedule 15.11.2009    source источник


Ответы (4)


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

Здесь применяется тот же принцип, за исключением того, что вместо ссылки на файл статического изображения вам нужно ссылаться на обработчик 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 -->
person Rex M    schedule 15.11.2009
comment
+1 - также обратите внимание, что это означает, что вам, вероятно, придется переосмыслить, как работает ваша текущая страница, поскольку вы, вероятно, получили массив байтов в процессе обработки запроса для другого ресурса. - person Joel Coehoorn; 15.11.2009

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

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

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

}
person Jay Stratemeyer    schedule 28.09.2012
comment
Умное решение. Имейте в виду, что IE до версии 8 не могут использовать схему URL-адресов данных caniuse.com/datauri. - person Matthew Lock; 23.05.2013
comment
Большое вам спасибо за решение моей проблемы с минимальным количеством шагов. - person Ahmad; 29.05.2013

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

<%@ 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" />
person Darin Dimitrov    schedule 15.11.2009

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

person vitaly-t    schedule 23.08.2012