본문 바로가기

ASP.NET

ASP.NET Generated Image 컨트롤

얼마 전 한 신입사원이 데이터베이스에 저장되어 있는 BLOB형태의 이미지 파일을 ASP.NET 웹페이지로 출력하기 위해서, 데이터베이스에서 byte배열을 얻어서 하드디스크에 GUID형태의 이름을 가지는 이미지로 저장한 다음 그 파일을 출력하고, 이미지를 생성할때 마다 파일이 생성될 폴더에 파일 중 생성시간이 하루 이상 지난파일을 삭제하는 로직으로 짜고 있는것을 본적이 있었습니다.

검색엔진에 검색 한번으로 엄청난 양의 레퍼런스 코드가 쏟아져 나올텐데도, 자기 나름대로 계획을 세우고 꿋꿋하게 그걸 구현해 나가는 모습을 보고 얘한테 뭐라고해야하나 말아야하나 고민을 했었더랬습니다.

당시에는 핸들러파일(ashx)파일에서 이미지를 출력하도록하는 방법을 알려주고 끝냈었는데, 오늘 보니 Micorosft에서 ASP.NET Generated Image 라는 상당히 유용해 보이는 컨트롤을 내놓았네요.

서버 컨트롤형태로 구현되어 있고, 각 용도별 구현을 위해서 ImageHandler를 상속받는 ashx 핸들러 파일을 생성하여 컨트롤에 지정하도록 하고 있습니다.
즉, 이미지관련 처리를 위한 라이브러리를 제공하고 그 라이브러리를 이용해서 실제 이미지를 그리는 부분은 사용자에게 맡기는 형태입니다.

예제를 한번 보자면, 페이지에 컨트롤을 올리면
captured_Image.png 
디자인뷰 코드상에서 보면

<cc1:GeneratedImage ID="GeneratedImage1" runat="server" 
    ImageHandlerUrl="~/ImageHandler1.ashx" >
    <Parameters>
      <cc1:ImageParameter Name="Msg" Value="Welcome To CodeDigest" />
      </Parameters>
</cc1:GeneratedImage>
이미지를 처리할 대상을 ImageHandler1.ashx 로 설정하였습니다.
즉, 이미지 출력에 관한 모든 것은 ImageHandler1.ashx가 처리하는 것입니다.
ImageHandler1.ashx는 아래와 같습니다.
<%@ WebHandler Language="C#" Class="ImageHandler1" %>
 
using System;
using System.Collections.Specialized;
using System.Drawing;
using System.Web;
using Microsoft.Web;
 
public class ImageHandler1 : ImageHandler {
    
    public ImageHandler1() {
        // Set caching settings and add image transformations here       
       }
    
    public override ImageInfo GenerateImage(NameValueCollection parameters) {
        // Add image generation logic here and return an instance of ImageInfo
        Bitmap bit = new Bitmap(500, 500);
        Graphics gra = Graphics.FromImage(bit);
        gra.Clear(Color.AliceBlue);
        gra.DrawString(parameters["Msg"], new Font("Verdana", 16), Brushes.Black,0 , 150);
        this.ImageTransforms.Add(new WaterMark());
        return new ImageInfo(bit);
    }
}

위 코드는 새로운 Bitmap을 생성하서 그 안에 매개변수로 넘어온 메시지를 드로잉하여 반환합니다.
그러므로, 이 예제의 결과는 아래와 같습니다.
captured_Image.png[5]

하지만, 지정한 핸들러파일의 GenerateImage메서드의 구현에 따라서 이미지는 어떠한 형태로도 출력이 가능해 집니다.
DB에서 이미지를 불러와서 출력하는 것도 가능하고, 이미지의 리사이즈 및 이미지에 워터마크를 넣고, 테두리를 입히는 작업등 구현에 따라 다른 형태의 이미지를 출력할 수 있을것입니다.

컨트롤의 다운로드는 여기서 가능하시고, .NET Framework 3.5 SP1이 적용되어야 사용이 가능합니다.

좀더 자세한 내용 및 관련 예제은 다음 글 에서 확인이 가능합니다.
New Image Generator control in ASP.Net 3.5