2009-04-16 4 views
2

ASP.NET에서 일반 갤러리를 만들고 있지만 미리보기 이미지를 만드는 데 약간의 경험이 있습니다. 알고리즘 및 GetThumbnailImage 메서드를 알고 있지만 내 문제는 다른 어딘가에있다 - ImageButton 컨트롤을 사용하여 이미지를 (그냥 크기가 조정 된) 표시 해요. 그리고 그것이 요점입니다. "thumbnailed"이미지를 ImageUrl 속성에 연결하는 방법을 모릅니다. 심지어 가능하니, 그렇다면 어떻게? 아니면 대신 다른 컨트롤을 사용해야합니까? 어떤 제안을 주셔서 감사합니다!ASP.NET에서 축소판 그림을 표시하는 가장 좋은 방법은 무엇입니까?

답변

5

이미지 요청을 처리하고 축소판을 반환하는 HttpHandler를 만들거나 이미지에 필요한 모든 것을 할 수 있습니다. 당신은 ASP.NET에서 그래픽 물건을 할 때마다

거의 System.Drawing의 모든은 GDI +의 래퍼이며 thetrefore가 적절하게 배치 할 필요가 관리되지 않는 메모리에 대한 참조를 보유 염두에 두어야합니다 (using 문을 사용) . 이것은 StringFormat 등의 간단한 클래스에도 적용됩니다.

+0

고맙습니다. 시도해 보겠습니다. – jkottnauer

+1

아마도 이미지를 캐쉬해야합니다. 왜냐하면이 모든 것이 잘 확장되지 않기 때문입니다 ... –

+0

오른쪽. 캐싱 너무 동적하지만 ASP.NET에서 물건을 계산하는 "복잡한"일반적으로 좋은 생각입니다 ... – Lucero

6

HttpHandler를 설정해야 크기가 조정 된 이미지를 만들 수 있고 디스크에 캐시 할 수있는 것처럼 들리므로 각 이미지에 미리보기 이미지를 다시 만들지 않아도됩니다. 의뢰.

따라서, 예를 들어 : 당신은 다음 핸들러 것

<asp:ImageButton ID="ImageButton1" ImageUrl="~/ImageHandler.ashx?ImageId=123" runat="server /> 

:

namespace MyProject 
{ 
    public class ImageHandler : IHttpHandler 
    { 
     public virtual void ProcessRequest(HttpContext context) 
     { 
      // 1. Get querystring parameter 
      // 2. Check if resized image is in cache 
      // 3. If not, create it and cache to disk 
      // 5. Send the image 

      // Example Below 
      // ------------- 

      // Get ID from querystring 
      string id = context.Request.QueryString.Get("ImageId"); 

      // Construct path to cached thumbnail file 
      string path = context.Server.MapPath("~/ImageCache/" + id + ".jpg"); 

      // Create the file if it doesn't exist already 
      if (!File.Exists(path)) 
       CreateThumbnailImage(id); 

      // Set content-type, content-length, etc headers 

      // Send the file 
      Response.TransmitFile(path); 
     } 

     public virtual bool IsReusable 
     { 
      get { return true; } 
     } 
    } 
} 

는 또한 Web.config의

<system.web> 
    <httpHandlers> 
     <add verb="*" path="ImageHandler.ashx" type="MyProject.ImageHandler, MyProject"/> 
    </httpHandlers> 
</system.web> 

이를 설정해야합니다 것 이것은 당신을 시작하게하는데 충분할 것입니다. 미리보기 이미지를 만들려면 ProcessRequest 메서드를 수정해야하지만 이미 처리했음을 언급했습니다. 또한 파일을 브라우저로 전송할 때 헤더를 올바르게 설정해야합니다.

+1

작은 수정을 확인하십시오. context.Response.TransmitFile (path);를 호출해야합니다. –

1

Http 처리기를 사용하십시오.

성능에 대한 또 다른주의 사항 : 이미지 조작은 메모리와 CPU 관점 모두에서 디스크 공간에 비해 비쌉니다. 따라서 전체 이미지에서 미리보기 이미지를 생성하는 것은 전체 이미지 각각에 대해 한 번만 수행하려는 것입니다. 가장 좋은 시간은 아마도 이미지가 업로드되는 시점 일 것입니다. 특히 동일한 페이지에 여러 이미지가 표시되는 것이 좋습니다.

관련 문제