Подтвердить что ты не робот

Bytearray to image asp.net

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

4b9b3361

Ответ 1

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

Здесь применяется тот же принцип, за исключением того, что вместо ссылки на статический файл изображения вам нужно ссылаться на обработчик 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";
    }
}

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

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

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

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

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

<img src="/imagehandler.ashx?img=<%=id%>" />
<!-- will print ...ashx?img=42a96c06-c5dd-488c-906f-cf20663d0a43 -->

Ответ 2

Еще одна вещь, которую вы можете сделать быстрее, - это не использовать элемент управления 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]);

}

Ответ 3

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

<%@ 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" />