이번 시간에는 이미지에 워터마크를 찍어보는 시간을 갖겠습니다.
우선 이 내용이 이해가 가지 않는 분은
제네릭처리기를이용하여자동가입방지구현아티클을 선수학습 하세요~
 
오늘 알아볼 내용은 무척이나 간단하답니다.
 
우선 IIS 에서 자신의 웹사이트의 구성으로 가셔서 다음의 “.mark” 확장자를 매핑하세요
 
이제 web.config 의 httpHandlers 섹션에 다음의 구문을 추가해 줍니다
<addverb="*"path="*.mark"type="UmcMarkImageHandler, App_Code"></add>
Type 속성은 클래스이름(네임스페이스부터) 과 DLL 이름으로 구성되어 있습니다.
 
위의 UmcMarkImageHandler 는 IHttpHandler 만 상속받아 작성하시면 됩니다.
 
UmcMarkImageHandler.cs
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
 
///<summary>
/// UmcMarkImageHandler의 요약 설명입니다.
///</summary>
public class UmcMarkImageHandler : IHttpHandler
{
       public UmcMarkImageHandler()
       {
       }
 
       #region IHttpHandler 멤버
       public bool IsReusable
       {
             get
             {
                    return false;
             }
       }
 
       public void ProcessRequest(HttpContext context)
       {
             string filename = context.Request.Path;
             string fn = Path.GetFileName(filename).ToLower();
             string ext = Path.GetExtension(fn);
             // 확장자가 .mark 가 아니라면 걍 이미지를 뿌려준다.
             if (!(ext == ".mark"))
             {
                    System.Drawing.Image nonImg = System.Drawing.Image.FromFile(context.Server.MapPath(filename));
 
                    nonImg.Save(context.Response.OutputStream, ImageFormat.Jpeg);
 
                    nonImg.Dispose();
 
                    return;
             }
 
             // 이미지를 가져와서...
             System.Drawing.Image img = System.Drawing.Image.FromFile(context.Server.MapPath(filename));
             Bitmap bitmap = new Bitmap(img.Width, img.Height);
             Graphics g = Graphics.FromImage(bitmap);
 
             g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
             g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
 
             // 이 이미지는 합성될 이미지 입니다.
             System.Drawing.Image imgText = System.Drawing.Image.FromFile(context.Server.MapPath("mark.gif"));
 
             // 여기서부터 mark.gif 의 마크업 이미지에 투명도를 줘서 합성시킵니다.
             float[][] matrixItems ={
                                    new float[] {1, 0, 0, 0, 0},
                                    new float[] {0, 1, 0, 0, 0},                                      
                                    new float[] {0, 0, 1, 0, 0},
                                    new float[] {0, 0, 0, 0.8f, 0},                                          
                                    new float[] {0, 0, 0, 0, 1}};
             ColorMatrix colorMatrix = new ColorMatrix(matrixItems);
             ImageAttributes imageAtt = new ImageAttributes();
             imageAtt.SetColorMatrix(
                    colorMatrix,
                    ColorMatrixFlag.Default,
                    ColorAdjustType.Bitmap);
             g.DrawImage(imgText,
                    new Rectangle(0, 0, img.Width, img.Height),
                    0,
                    0,
                    imgText.Width,
                    imgText.Height,
                    GraphicsUnit.Pixel,
                    imageAtt);
             g.DrawImage(img,
                    new Rectangle(0, 0, img.Width, img.Height),
                    0,
                    0,
                    img.Width,
                    img.Height,
                    GraphicsUnit.Pixel,
                    imageAtt);
 
             bitmap.Save(context.Response.OutputStream, ImageFormat.Jpeg);
 
             g.Dispose();
             img.Dispose();
             imgText.Dispose();
             bitmap.Dispose();
       }
       #endregion
}
 
약간 소스가 쬐~~까~~ 긴감이 있네요~
 
여기서 mark.gif 이미지 만드는 법을 알려드리겠습니다.
포토샵에서 원하는 글자를 적으신 후 글자 이외의 배경은 투명하게 만드세요
 
Mark.gif
 
보이는 대로 위 이미지와 합성될 것입니다.
 
MarkImage.aspx
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>제목 없음</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
             두 이미지는 같은 이미지 입니다. 확장자만 바꾼결과 마크 이미지가 생겼습니다.<br>
             <br>
             image.jpg<br>
             <img src="image.jpg" />
             <p />
             image.mark<br>
             <img src="image.mark" />
    </div>
    </form>
</body>
</html>
 
이제 완성이 되었네요~
 
이 예제의 샘플을 보시려면

http://umc.pe.kr/Sample/MarkImage/marksample.umcx


근데 정확히 시간은 재보지 않았지만, 눈에 띄게 합성 속도가 느리더군요~
샘플로 사용된 이미지 자체가 뷁~ 스럽게 큰 이유도 있고,
이미지 출력을 JPG 압축하는 이유도 있겠습니다만..^^; 
한가지 팁… 확장자를 JPEG 또는 JPG 등으로 사용하시면 안됩니다.
브라우져가 먼저 이미지를 뿌려주지 않고, 닷넷이 먼저 확장자에 접근합니다.
 
이부분을 좀더 활용해 보시면 의외로 응용부분이 많을 겁니다^^
 
이런;;
 
다음번에는 이것보다 더 유익한거 하나 알려드릴께요^^
기대하세용~

Posted by 땡초 POWERUMC

댓글을 달아 주세요

ConfirmBitmapHandler.zip



정말 간만에 다시 글을 쓰게 되었네여~
세월아~ 네월아~~
오늘은 자동가입방지, 또는 자동댓글/글쓰기 방지를 위해 뭐좀 하나 만들어 보았습니다.
이번 방법은 제네릭 처리기를 이용하려고 합니다.
우선 다음과 같이 제네릭 처리기를 새항목 추가 합니다.
 
 

제네릭 처리기가 뭘까 해서 MSDN 을 보니…. 안나왔더군요~ ㅋ
우선 제네릭 처리기를 생성해 보기로 하겠습니다.
 
.. 단순히 IHttpHandler 를 상속하였네요~
친절하게도 Hello World 와 함께 말이져~
 
요놈은 IIS 에 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 과 같이 매핑이 되어있으며, C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\Web.Config 에
<add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory"
        validate="true" /> 과 같이 핸들러가 등록 되어 있군요~,
 
결론은 IHttpHandler 를 구현하라는 것이네요.
 
그럼 ConfirmBitmapHandler.ashx 의 소스를 보여드립니다.
<%@ WebHandler Language="C#" Class="ConfirmBitmapHandler" %>
 
using System;
using System.Web;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Web.SessionState;
 
public class ConfirmBitmapHandler : IHttpHandler, IRequiresSessionState {
   
    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "image/jpeg";
              
               // 이미지사이즈
               int lenX = 80, lenY = 30;
              
               Bitmap bm              = new Bitmap( lenX, lenY );
              
               Graphics g             = Graphics.FromImage( bm );
              
               // 배경으로그라데이션처리
               LinearGradientBrush bgGr = new LinearGradientBrush(
                       new Point(0,0),
                       new Point(lenX, lenY),
                       Color.Blue,
                       Color.Black);
                             
               g.FillRectangle( bgGr, 0, 0, lenX, lenY );
              
               // 5자리숫자의난수를발생하여텍스트를만든다           
               string text = string.Empty;
               Random rnd = new Random();
               for(int i=0; i<5; i++)
               {
                       text += rnd.Next(9).ToString();
               }
              
               // 텍스트를그린다.
               Brush textBrush        = new SolidBrush( Color.White );
               g.DrawString( text, new Font("굴림", 15), textBrush, 10, 5, StringFormat.GenericDefault );
              
               // 스트림에비트맵을쓴다.
               bm.Save( context.Response.OutputStream, ImageFormat.Jpeg );
              
               // 5자리숫자를세션에담는다.
               context.Session["ValidateString"] = text;
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
 
}
 
그럼 이제 우리가 만든 ConfirmBitmapHandler.ashx 를 브라우져 보기를 통해 실행해 보십시오
 
실행결과>>>
 
오오~~~~~ 짝짝짝~~ 잘 실행이 되었네여~
 
그럼 다음으로 방금 만든 전처리기를 이용하여 웹어플케이션을 만들어 봅시다.
 
소스 ( Default.aspx )
<%@ Page Language="C#" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<script runat="server">
 
        private void Page_Load(object sender, EventArgs e)
        {
        }
       
        protected void lnkValidate_Click(object sender, EventArgs e)
        {
               string validateString = (string)Session["ValidateString"] ?? string.Empty;
 
               if (txtValidateString.Text == validateString )
                       lblResult.Text = "오케이~~ 통과~!";
               else
                       lblResult.Text = "틀렷삼~~~~~ ";
        }
</script>
<script type="text/javascript">
        function checkEnter()
        {
               if( event.keyCode == 13 )
               {
                       __doPostBack('lnkValidate','');
               }
               else
                       return true;
        }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>제목없음</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
               <img src="ConfirmBitmapHandler.ashx" />
               <p></p>
               <asp:TextBox ID="txtValidateString" runat="server" onkeypress="return checkEnter()"></asp:TextBox>&nbsp;&nbsp;&nbsp;
               <asp:LinkButton ID="lnkValidate" runat="server" OnClick="lnkValidate_Click">확인</asp:LinkButton>
               <p></p>
               <asp:Label ID="lblResult" runat="server"></asp:Label>
    </div>
    </form>
</body>
</html>
 
 
이 소스는 대부분 어렵지 않게 보실 수 있을 것 같아서 특별히 주석은 안달았습니다.
 
 
이것을 이용하여 다음엔 시간나는대로 이미지 도용방지 어플케이션을 작성해 보도록 할게여~
Posted by 땡초 POWERUMC

댓글을 달아 주세요