bytearray към изображение asp.net

Имам байтов масив, представляващ картина. Искам да представя картината, съхранена в този байтов масив в aspx страница. Мога ли да го направя с помощта на контрола за изображение или карта на изображения? Ако да - как? Ако не - какво е решението?


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 control и да използвате основния img елемент в html. Така че във вашата страница asp.net създайте img елемент с id на 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]);

}
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:Изображение

person vitaly-t    schedule 23.08.2012