문제

MemoryStream을 asp:image 컨트롤에 바인딩하는 방법이 있습니까?

도움이 되었습니까?

해결책

핸들러는 다른 요청과 마찬가지로 URL 매개변수를 허용할 수 있습니다.따라서 링크를 연결하는 대신 <asp:image/> 에게 image.ashx 넌 그걸로 설정했을 거야 image.ashx?ImageID=[Your image ID here].

다른 팁

가장 좋은 방법은 이미지를 반환하는 HttpHandler를 만드는 것입니다.그런 다음 asp:Image의 ImageUrl 속성을 HttpHandler의 URL에 바인딩합니다.

여기에 몇 가지 코드가 있습니다.

먼저 HttpHandler를 만듭니다.

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

using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;

public class ImageHandler : IHttpHandler
{    
    public void ProcessRequest (HttpContext context)
    {
        context.Response.Clear();

        if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
        {
            int id = Int32.Parse(context.Request.QueryString["id"]);

            // Now you have the id, do what you want with it, to get the right image
            // More than likely, just pass it to the method, that builds the image
            Image image = GetImage(id);

            // Of course set this to whatever your format is of the image
            context.Response.ContentType = "image/jpeg";
            // Save the image to the OutputStream
            image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
        else
        {
            context.Response.ContentType = "text/html";
            context.Response.Write("<p>Need a valid id</p>");
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
   }

   private Image GetImage(int id)
   {
       // Not sure how you are building your MemoryStream
       // Once you have it, you just use the Image class to 
       // create the image from the stream.
       MemoryStream stream = new MemoryStream();
       return Image.FromStream(stream);
   }
}

다음으로, asp:Image를 사용하고 있는 aspx 페이지 내에서 호출하세요.

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
        </div>
    </form>
</body>
</html>

그리고 그게 다입니다.

ASP.NET에서 동적 이미지를 생성해야한다고 가정합니다. 운이 좋을 수도 있습니다.http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

Hanselman은 최근에 이에 대해 블로그에 올렸습니다.http://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx

@Will 및 Ben Griswald:"image.aspx" 대신 "image.ashx"를 사용하세요.

이는 전체 ASP.Net 페이지보다 더 가볍고 text/html 이외의 콘텐츠 유형을 처리하도록 특별히 설계되었습니다.

MemoryStream을 이미지에 데이터 바인딩하는 것은 불가능하지만 Label/GenericControl, 일부 코드 및 데이터 URI 체계 페이지에 이미지를 삽입하는 방법이 있지만 해당 접근 방식에는 심각한 문제가 있습니다.

단점

  • 변경하기 전에 포함된 콘텐츠를 추출하고 디코딩한 다음 나중에 다시 인코딩하고 다시 포함해야 합니다.
  • 쿠키는 지원되지 않습니다.
  • 두 번 이상 포함된 정보는 포함된 파일의 일부로 다시 다운로드되므로 브라우저 캐시의 이점을 누릴 수 없습니다.
  • 브라우저는 URI 길이를 제한하여 효과적인 최대 데이터 크기를 생성할 수 있습니다.예를 들어, 이전 버전의 Opera에서는 URI가 4kB로 제한되었고 IE8 Beta 1에서는 32kB로 제한되었습니다.
  • 데이터는 단순한 스트림으로 포함되며 많은 처리 환경(예: 웹 브라우저)에서는 메타데이터, 데이터 압축 또는 콘텐츠 협상과 같은 더 큰 복잡성을 제공하기 위해 컨테이너(예: multipart/alternative 또는 message/rfc822) 사용을 지원하지 않을 수 있습니다.
  • Microsoft의 Internet Explorer 버전 7(2008년 2분기 현재 시장의 약 70%)까지는 지원이 부족합니다.

더 나은 접근 방식은 ASP.net을 배우기 시작할 때 만든 사진 앨범 소프트웨어에서 했던 것처럼 MemoryStream을 가져와 출력하는 별도의 "Image.aspx" 페이지를 사용하는 것입니다.

(웃지 마세요. ASP.net에서의 첫 시도였습니다 :-)

편집하다:ASHX에 동의한 위의 코드는 단지 하나의 샘플 구현을 보여주기 위한 것입니다.사진 앨범을 업데이트하려고 하면 ASHX가 사용됩니다.

ASP.net용 Telerik의 BinaryImage 컨트롤을 사용할 수 있습니다.

여기에 더 많은 정보가 있습니다:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx

아니요.

하지만 해당 이미지를 스트리밍하는 특수 페이지를 만들 수 있습니다.먼저 이미지를 가져올 수 있는 위치를 알려주는 일부 URL 매개변수를 포함하여 스트리밍을 수행하는 페이지에 이미지의 URL을 설정합니다.

<img src="GetImage.aspx?filename=foo" ... />

GetImage.aspx에서는 URL에서 파일 이름(또는 무엇이든)을 가져오고 MemoryStream에 이미지를 로드한 다음 해당 메모리 스트림의 내용을 HttpResponse에 직접 씁니다.

    response.Expires = 0;
    response.Buffer = false;
    response.Clear();
    response.ClearHeaders();
    response.ClearContent();
    response.ContentType = "image/jpeg";
    response.BinaryWrite(stream);
    response.Flush();
    response.Close();

나에게는 @Page에 "buffer="false"를 추가해야 했습니다.안그러면 계속 똑같은 사진만 나올텐데...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top