Laboratory/Develop

이미지를 합성해보자~ [ 이미지 도용방지 ] 2007-04-06

theking 2007. 9. 18. 22:40

  
이미지를 합성해보자~ [ 이미지 도용방지 ] 2007-04-06


Written By 엄준일(땡초)
 
 

이번 시간에는 이미지에 워터마크를 찍어보는 시간을 갖겠습니다.
우선 이 내용이 이해가 가지 않는 분은
“제네릭처리기를이용하여자동가입방지폼구현” 아티클을 선수학습 하세요~
 
오늘 알아볼 내용은 무척이나 간단하답니다.
 
우선 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 등으로 사용하시면 안됩니다.
브라우져가 먼저 이미지를 뿌려주지 않고, 닷넷이 먼저 확장자에 접근합니다.
 
이부분을 좀더 활용해 보시면 의외로 응용부분이 많을 겁니다^^
 
이런;;
이젠 먹으면서 글 쓰는게 취미가 되어가나 봅니다.
얼른 병 치우고 자야지 ㅡ.ㅡ
 
다음번에는 이것보다 더 유익한거 하나 알려드릴께요^^
기대하세용~

 

 

--------------------------------------------------------------------------------
  이 저작물은  크리에이티브 커먼즈 코리아 저작자 표시-비영리-동일조건변경허락  2.0 대한민국 라이센스에 따라 이용하실 수 있습니다. 

--------------------------------------------------------------------------------