이미지를 합성해보자~ [ 이미지 도용방지 ] 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 대한민국 라이센스에 따라 이용하실 수 있습니다.
--------------------------------------------------------------------------------