아름다운 세상속에
그대는 나의 모든걸
가져간 바람둥이..

NearFondue PopupNotice_plugin
7 일동안 열지 않음 close

IE6 flickering bug - 988번째 이야기

Category : 데이터뱅크/Web
간단히 말해, IE6에서 롤오버 이미지를 계속해서 재 읽는 버그
도데체 windows me 와 ie6은 어쩔 수 없단 말인가..
나두 웹 작업을 하지만, ie6은 뭐 그리 건들일게 많은지.
사용자마다 옵션-일반-임시파일을 '페이지 열 때 마다'가 아닌 '자동'으로 맞춰주면 된다지만..
이게 말이 쉽지.
with js
  1. <script type="text/javascript">  
  2. (function(){  
  3.  /*Use Object Detection to detect IE6*/  
  4.  var m = document.uniqueID /*IE*/  
  5.  && document.compatMode /*>=IE6*/  
  6.  && !window.XMLHttpRequest /*<=IE6*/  
  7.  && document.execCommand ;  
  8.  try{   
  9.   if(!!m){  
  10.    m("BackgroundImageCache"falsetrue/* = IE6 only */  
  11.    }  
  12.   }catch(oh){};  
  13.  })();  
  14. </script>  
with css
  1. <!--[if IE 6]>  
  2. <style type="text/css">  
  3. html {  
  4.   filter: expression(document.execCommand("BackgroundImageCache"falsetrue));  
  5. }  
  6. </style>  
  7. <![endif]-->  

Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

Making IE use PNG Alpha transparency - 970번째 이야기

Category : 데이터뱅크/Web
This fix is deprecated and is no longer supported (meaning that I will not help you to get it working with your pages). It was only written to fill the gap while waiting for Internet Explorer to implement PNG alpha. That has now happened in IE 7. Although this fix can make it work in IE 6 as well, that is counter productive for the future of the Web. IE 6 is a major problem to Web developers (IE 7 is a problem as well, but for now, let's overlook that, since it does at least implement PNG alpha), and the sooner it stops being used, the better.

Instead of using this hack, users of IE 6 should be encouraged to upgrade to IE 7. Users who cannot upgrade to IE 7 (because IE 7 is not being released for most Windows operating systems) should use a better browser, such as Opera or Firefox. They have been abandoned by Microsoft.



This is not valid CSS, and it may cause problems in IE 7. If you want to make it valid, you can put the extra CSS in a conditional comment, and use that to protect IE 7, make it work in IE 5.5-6, and allow your page to validate. However, this would need to contain one CSS rule for each image, as the filter needs to be different for each image. For this reason, I assign an ID to each span, and then use the ID to set the filter.

set css mark

  1. <!--[if gte IE 5.5]>  
  2. <![if lt IE 7]>  
  3. <style type="text/css">  
  4. #alImg1 img, #alImg2 img { filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); }  
  5. #alImg1, #alImg2 { display: inline-block; }  
  6. #alImg1 { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='varyAlpha.png'); }  
  7. #alImg2 { filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='alphaTwo.png'); }  
  8. </style>  
  9. <![endif]>  
  10. <![endif]-->  
  11.   
  12. ...  
  13.   
  14. <span id="alImg1" style="width:400px;height:32px;">  
  15. <img src="varyAlpha.png" width="400" height="32" border="0" alt=""></span>  
  16. <span id="alImg2" style="width:30px;height:50px;">  
  17. <img src="alphaTwo.png" width="30" height="50" border="0" alt=""></span>  

scrap from How To Create



And another road

include js or head area
  1. function setPng24(obj) {  
  2.  obj.width=obj.height=1;  
  3.  obj.className=obj.className.replace(/\bpng24\b/i,'');  
  4.  obj.style.filter ="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+ obj.src +"',sizingMethod='image');"  
  5.  obj.src='';  
  6.  return '';  
  7. }  

set css mark
  1. .png24 { tmp:expression(setPng24(this)); }  

insert code
  1. <img src="imgsrc/img.png" class="png24">  

only <img> not op <background>
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

이뻐진 TEXTCUBE 1.6 - 928번째 이야기

Category : 데이터뱅크/Web
사용자 삽입 이미지
550 x 383 pixels
사용자 삽입 이미지
550 x 393 pixels
사용자 삽입 이미지
550 x 399 pixels

간단히 몇자 끄적끄적
쉽게 블로그에서 Q버튼을 눌러 보이는 로그인 페이지~
그리고 위에서 보이다시피 다중(팀)블로거를 위한 관리자 메뉴 추가
자세한 내용은 http://www.textcube.org 를 참고~

항상 블로그에 직접 1주일에 2~3번씩 업데이트하며 테스트하고 있지만,
지금은 rc3, 곧 나올 1.6을 기다리며..
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

SP2 판별 javascript - 548번째 이야기

Category : 데이터뱅크/Web
  1. <script language=javascript>  
  2. function browserVersion()  
  3. {      
  4.   
  5.     tmp_MSIE = window.navigator.userAgent.indexOf("MSIE");  
  6.     if(tmp_MSIE && window.navigator.userAgent.indexOf("SV1") > tmp_MSIE)  
  7.     {     
  8.   
  9.          //This browser is Internet Explorer with SP2.     
  10.          return true;   
  11.     }   
  12.     else   
  13.     {  
  14.   
  15.           //This browser is not Internet Explorer with SP2.  
  16.           return false;  
  17.     }  
  18. }  
  19. var xpie_SP2 = browserVersion();  
  20.   
  21. if(xpie_SP2)  
  22. {  
  23.     //SP2 true...  
  24. }  
  25. else  
  26.   
  27. {  
  28.     //SP2 false...  
  29. }  
  30.   
  31. </script>  
SP2에선 팝업창을 띄울시 하단의 status바를 포함하여 세로길이를 20pixel 추가.
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

IE 외 투명도 설정 - 536번째 이야기

Category : 데이터뱅크/Web
IE외 브라우저에서 투명도 설정은
opacity: .5;
아래는 IE전용
filter: alpha(opacity=50);
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

스크립트로 페이지를 이동시키자 - 507번째 이야기

Category : 데이터뱅크/Web
매번 링크 적을 때마다 귀차니즘 이었는데 .. 이거 딱이네..

스크립트로 페이지를 이동시키는 방법은 링크에 href="링크주소"를 걸어주는 방법보다 중복링크가 많을때 상당히 유용합니다.
js파일에 해당링크를 지정해두고 필요할때 꺼내 쓰기만 하면 되니까요 :)
실로 플래시메뉴를 만들때 이같은 방법으로 링크를 지정하면 플래시 파일의 수정없이 스크립트 파일만 간단히 고칠 수 있어 편리합니다.

아래는 문자를 이용하는 방법과 숫자를 이용하는 방법 2가지 예제가 있습니다.
어느것을 쓰셔도 무방하지만 숫자를 이용하는 방법에는 변수가 항상 숫자여야한다는 점을 주의하셔야합니다.

숫자를 이용하는 방법
js파일
function My(num) {
       if ( num == 1)
      {
              location.href="/index.htm"
              return;
       }
       if ( num == 2)
       {
              location.href="/etc/private.htm"
              return;
       }
}


html부분
<a href="My(1);" onfocus="this.blur()" title="기본정보변경">기본정보변경</a>

문자를 이용하는 방법
js파일
function getTop(code) {
         if ( code == "home")
        {
                 location.href="/index.htm"
                 return;
        }
         if ( code == "login")
        {
                 window.open('/login.htm','login','width=400,height=220');
                 return;
         }
}

html부분
<a href="getTop('login');">로그인</a>


* 스크랩 출처
      cm@blog
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

영문 입력시 테이블 깨짐 방지 - 311번째 이야기

Category : 데이터뱅크/Web
테이블이 늘어나는 경우
(td style="word-break:break-all;")

이미지로 인해 깨지는 테이블이 늘어나는 경우
테이블넓이에 따라 이미지만 보여준다.
(table style="table-layout:fixed;")


  * 스크랩 출처
       const34
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

여러가지 체크로직 script - 310번째 이야기

Category : 데이터뱅크/Web
  1. <!--  
  2.     //최상위 체크 로직(chars로 넘긴 값이 있다면 true)  
  3.     function containsCharsOnly(input,chars) {  
  4.         for (var inx = 0; inx < input.value.length; inx++) {  
  5.             if (chars.indexOf(input.value.charAt(inx)) == -1)  
  6.                 return false;  
  7.         }  
  8.         return true;  
  9.     }  
  10.     //최상위 체크 로직(chars로 넘긴 값이 있다면 false)  
  11.  function containsChars(input,chars) {  
  12.      for (var inx = 0; inx < input.value.length; inx++) {  
  13.         if (chars.indexOf(input.value.charAt(inx)) != -1)  
  14.             return true;  
  15.      }  
  16.      return false;  
  17.  }  
  18.     // 숫자 체크  
  19.     function isNum(input) {  
  20.         var chars = "0123456789";  
  21.         return containsCharsOnly(input,chars);  
  22.     }  
  23.  //이름체크  
  24.  function nameCheck(input){  
  25.   var chars = '0123456789~!#$%^&amp;amp;amp;amp;*()_-+=|{}[]<>,./?@';  
  26.   
  27.         return containsChars(input,chars);  
  28.  }  
  29.     // 전화 번호 Check  
  30.     function isPhoneCheck(input) {   
  31.      var chars = "0123456789( ).-,<>{}[]_~";  
  32.         return containsCharsOnly(input,chars);  
  33.     }  
  34.     // 영문 판별  
  35.     function isPhoneCheck(input) {   
  36.      var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  37.         return containsCharsOnly(input,chars);  
  38.     }  
  39.     // 영숫자 판별  
  40.     function isPhoneCheck(input) {   
  41.      var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  
  42.         return containsCharsOnly(input,chars);  
  43.     }  
  44.  // 입력값이 숫자,대시(-)로 되어있는지 체크  
  45.  function isNumDash(input) {  
  46.      var chars = "-0123456789";  
  47.      return containsCharsOnly(input,chars);  
  48.  }  
  49.  // 입력값이 숫자,콤마(,)로 되어있는지 체크  
  50.  function isNumComma(input) {  
  51.      var chars = ",0123456789";  
  52.      return containsCharsOnly(input,chars);  
  53.  }  
  54.  // 입력값이 사용자가 정의한 포맷 형식인지 체크  
  55.  // 자세한 format 형식은 자바스크립트의 ''regular expression''을 참조  
  56.  function isValidFormat(input,format) {  
  57.      if (input.value.search(format) != -1) {  
  58.          return true; file://올바른 포맷 형식  
  59.      }  
  60.      return false;  
  61.  }  
  62.  /** 
  63.   * 입력값이 이메일 형식인지 체크 
  64.   * ex) if (!isValidEmail(form.email)) { 
  65.   *         alert("올바른 이메일 주소가 아닙니다."); 
  66.   *     } 
  67.   */  
  68.  function isValidEmail(input) {  
  69.  //    var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/;  
  70.      var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;  
  71.      return isValidFormat(input,format);  
  72.  }  
  73.  /** 
  74.   * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크 
  75.   */  
  76.  function isValidPhone(input) {  
  77.      var format = /^(\d+)-(\d+)-(\d+)$/;  
  78.      return isValidFormat(input,format);  
  79.  }  
  80.  // 콤마 없애기  
  81.  function removeComma(input) {  
  82.      return input.value.replace(/,/gi,"");  
  83.  }  
  84.  // 문자 변환 함수  
  85.     function alterString(str,before,after) {  
  86.      var returnStr = "";  
  87.      for(i = 0; i < str.length; i++) {  
  88.       value = str.charAt(i);  
  89.       index = before.indexOf(value);  
  90.       if(index >= 0) value = after.charAt(index);  
  91.       returnStr += value;  
  92.      }  
  93.      return returnStr;  
  94.     }  
  95.     // 소 --> 대문자 변환 함수  
  96.     function ToUpper(arg) {  
  97.      var str1 = "abcdefghijklmnopqrstuvwxyz";  
  98.      var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  99.      return alterString(arg,str1,str2);  
  100.     }  
  101.     // 대 --> 소문자 변환 함수  
  102.     function ToLower(arg){  
  103.      var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  104.      var str2 = "abcdefghijklmnopqrstuvwxyz";  
  105.      return alterString(arg,str1,str2);  
  106.     }  
  107.     // 반각 문자를 전각문자로  
  108.     function convert2ByteChar(x_char) {  
  109.         var x_2byteChar = ""//컨버트된 문자  
  110.         var c = x_char.charCodeAt(0);  
  111.         if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위  
  112.             if(c == 32) { //스페이스인경우 ascii 코드 32  
  113.                 x_2byteChar = unescape("%uFFFC");  
  114.             } else {  
  115.                 x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));  
  116.             }  
  117.         }  
  118.         return  x_2byteChar;  
  119.     }  
  120.     // 10진수를 16진수로  
  121.     function gf_DecToHex(x_dec) {  
  122.         var x_Hex = new Array();  
  123.         var x_serial = 0;  
  124.         var x_over16 = x_dec;  
  125.         var x_tempNum = 0;  
  126.         while(x_dec > 15) {  
  127.             var x_h = x_dec % 16; //나머지  
  128.             x_dec = parseInt(x_dec/16); //몫  
  129.             x_Hex[x_serial++] = (x_h > 9 ? String.fromCharCode(x_h + 55) : x_h); //16진수코드변환  
  130.         }  
  131.         //마지막은 몫의 값을 가짐  
  132.         x_Hex[x_serial++] = (x_dec > 9 ? String.fromCharCode(x_dec + 55) : x_dec); //16진수코드변환  
  133.         //몫,나머지,나머지,.....  
  134.         var retValue = "";  
  135.         for(var i=x_Hex.length ; i>0 ;i--) {  
  136.             retValue += x_Hex[i-1];  
  137.         }  
  138.         return retValue;  
  139.     }  
  140.     // input box에 space, &nbsp;등 만으로 넣고 장난 칠때 이들 문자 뺀 길이를 통해 유효성 체크한다...  
  141.     function CheckStr(strOriginal, strFind, strChange){   
  142.         var position, strOri_Length;   
  143.         position = strOriginal.indexOf(strFind);    
  144.         while (position != -1){   
  145.             strOriginal = strOriginal.replace(strFind, strChange);   
  146.             position = strOriginal.indexOf(strFind);   
  147.         }   
  148.         strOri_Length = strOriginal.length;   
  149.         return strOri_Length;   
  150.     }   
  151.     // 체크 박스에 체크가 되어 있으면 true  
  152.  function checkValidator(str) {   
  153.   if(str.checked) return true;   
  154.   else return false;  
  155.  }  
  156.  // 비밀번호는 4자 등 최대 최소 길이를 파람으로 주고 처리...   
  157.     function checkLength(str,minLng,maxLng){  
  158.         var ckstr = str.value.length;   
  159.         if (parseInt(ckstr) < parseInt(minLng) || parseInt(ckstr) > parseInt(maxLng)) return false;  
  160.         return true;  
  161.     }  
  162.     // 숫자만 받아서 아니면 메세지 보여 주는   
  163.     function onlyNumber(objEv) {  
  164.         if(!isNum(objEv)){  
  165.             alert("숫자만 입력가능합니다.");  
  166.             objEv.value = "";  
  167.             objEv.focus();  
  168.             return;  
  169.         }  
  170.     }  
  171.     // 숫자를 체크하다가 6자 등 원하는 만큼 이동후 다음 input 박스로 이동 시키는...  
  172.     function goJump(fname, len, goname){  
  173.         onlyNumber(fname);  
  174.         if (document.all[fname].value.length == len) document.all[goname].focus();  
  175.     }  
  176.   
  177.     // 주민등록번호 체크 로직  
  178.     function check_ResidentNO(str_f_num,str_l_num){    
  179.         var i3=0  
  180.         for (var i=0;i<str_f_num.length;i++){  
  181.          var ch1 = str_f_num.substring(i,i+1);  
  182.             if (ch1<'0' || ch1>'9') i3=i3+1;  
  183.         }  
  184.         if ((str_f_num == '') || ( i3 != 0 )) return false;  
  185.         var i4=0;  
  186.         for (var i=0;i<str_l_num.length;i++){  
  187.             var ch1 = str_l_num.substring(i,i+1);  
  188.             if (ch1<'0' || ch1>'9') i4=i4+1;   
  189.         }  
  190.         if ((str_l_num == '') || ( i4 != 0 )) return false;  
  191.         if(str_f_num.substring(0,1) < 4) return false;  
  192.         if(str_l_num.substring(0,1) > 2) return false;  
  193.         if((str_f_num.length > 7) || (str_l_num.length > 8)) return false;  
  194.         if ((str_f_num == '72') || ( str_l_num == '18'))  return false;  
  195.                   
  196.         var f1=str_f_num.substring(0,1)  
  197.         var f2=str_f_num.substring(1,2)  
  198.         var f3=str_f_num.substring(2,3)  
  199.         var f4=str_f_num.substring(3,4)  
  200.         var f5=str_f_num.substring(4,5)  
  201.         var f6=str_f_num.substring(5,6)  
  202.         var hap=f1*2+f2*3+f3*4+f4*5+f5*6+f6*7  
  203.         var l1=str_l_num.substring(0,1)  
  204.         var l2=str_l_num.substring(1,2)  
  205.         var l3=str_l_num.substring(2,3)  
  206.         var l4=str_l_num.substring(3,4)  
  207.         var l5=str_l_num.substring(4,5)  
  208.         var l6=str_l_num.substring(5,6)  
  209.         var l7=str_l_num.substring(6,7)  
  210.         hap=hap+l1*8+l2*9+l3*2+l4*3+l5*4+l6*5  
  211.         hap=hap%11  
  212.         hap=11-hap  
  213.         hap=hap%10  
  214.         if (hap != l7) return false;  
  215.         return true;   
  216.     }  
  217.     // 바이트 구하기  
  218.     function getByteLen(str){  
  219.         return(str.length+(escape(str)+"%u").match(/%u/g).length-1);  
  220.     }  
  221.  // url 가져오기  
  222.     function getUrlAddress(){  
  223.         var pageUrl = document.location;   
  224.      pageUrl  = new String(pageUrl);  
  225.       return pageUrl.substring(0,pageUrl.lastIndexOf("/"));  
  226.     }  
  227.     // 오른마우스 금지, 나중에 해당 주석 풀고 사용  
  228.     function rightbutton(e){  
  229.         if (navigator.appName == 'Netscape' &&  (e.which == 3 || e.which == 2))  
  230.             return false;  
  231.         else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3))  
  232.         {  
  233.             alert("죄송합니다!! 정보무단복제를 막기 위하여 오른쪽 마우스 사용을 허용하지 않습니다.");  
  234.             return false;  
  235.         }  
  236.         return true;  
  237.     }  
  238.     //document.onmousedown=rightbutton;  
  239.       
  240.     // 컨트롤 키 금지, 나중에 해당 주석 풀고 사용  
  241.     function checkCtl(){  
  242.         if (document.all){  
  243.             if(event.keyCode==17) {  
  244.                 alert("죄송합니다!! 컨트롤키 사용을 허용하지 않습니다.");  
  245.                 return false;  
  246.             }  
  247.         }  
  248.     }  
  249.     //document.onkeydown = checkCtl;  
  250.   
  251.  function setCookie(name,value) {  
  252.      document.cookie = name+"="+escape(value)+";path=/;domain=.kkaok.pe.kr;";  
  253.  }  
  254.    
  255.  function setCookie(name,value, expires) {  
  256.      document.cookie = name + "=" + escape(value) +  
  257.      "; path=/; expires=" + expires.toGMTString();  
  258.  }  
  259.    
  260.  function getCookie(Name) {  
  261.      var search = Name + "="  
  262.      if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면  
  263.          offset = document.cookie.indexOf(search)  
  264.          if (offset != -1) { // 쿠키가 존재하면  
  265.              offset += search.length  
  266.              // set index of beginning of value  
  267.              end = document.cookie.indexOf(";", offset)  
  268.              // 쿠키 값의 마지막 위치 인덱스 번호 설정  
  269.              if (end == -1)  
  270.                  end = document.cookie.length  
  271.              return unescape(document.cookie.substring(offset, end));  
  272.          }  
  273.      }  
  274.  }  
  275.   
  276.    //문자 바꾸기, 사용법 var str = 문자열.replaceAll("a", "1");    
  277.     String.prototype.trim = function(){  
  278.         return this.replace(/(^\s*)|(\s*$)/gi, "");  
  279.     }  
  280.   
  281.     String.prototype.replaceAll = function(str1, str2) {  
  282.         var temp_str = "";  
  283.         if (this.trim() != "" && str1 != str2) {  
  284.             temp_str = this.trim();  
  285.             while (temp_str.indexOf(str1) > -1){  
  286.                 temp_str = temp_str.replace(str1, str2);  
  287.             }  
  288.         }  
  289.         return temp_str;  
  290.     }  
  291.   
  292. //-->  


head 부분에 script src로 삽입시키면 되겠지.

  * 스크랩 출처
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

이미지 링크 방지 .htaccess와 워터마킹이용 - 139번째 이야기

Category : 데이터뱅크/Web
개인 계정에서 블로그등의 사이트를 운영하시는 분들 중 가끔 외부에서의 컨텐츠 직링크로 인해 트래픽 초과에 걸리시는 분들이 많습니다. 트래픽 문제가 아니더라도, 무단 링크로 인해 저작권을 침해받는 경우도 있겠죠.
이를 해결하기 위해 레퍼러비교 같은 방법도 쓰곤 하는데, 아마 .htaccess 파일을 이용한 것도 많이들 아실 겁니다.

간단히, .htaccess와 워터마킹 기술을 이용해 이미지 링크 제어를 하는 법을 소개합니다.

일단, 이미지들이 저장되는 디렉토리에 .htaccess파일을 만듭니다. (이미 존재한다면 아래의 소스를 마지막에 추가하시면 됩니다.)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !explug\.com [NC]
RewriteCond %{HTTP_REFERER} !eouia0\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteRule (.*) image.php?image=$1

...........
잠깐 설명을 하자면,

RewriteCond %{HTTP_REFERER} !explug\.com [NC]
RewriteCond %{HTTP_REFERER} !eouia0\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]

이 부분에 링크를 허용할 URL들을 기재합니다. 정규식 패턴이므로 잘 알아서.. :)
위의 예의 경우 explug.com, eouia0가 포함되는 사이트, google 등에 링크를 허용한 경우입니다. 이 경우에는 원본 이미지를 마음대로 가져다 쓸 수 있습니다.
그외의 URL에서 링크가 걸릴 경우에는

RewriteRule (.*) image.php?image=$1

에 따라, image.php?image=파일이름 으로 리다이렉트됩니다. 만약 그냥 링크 자체를 끊고 싶으시다면 여기에 아무거나 써주셔도 되지요.

이제 워터마킹 처리를 위해 image.php를 작성합니다. GD라이브러리를 사용했으므로 GD가 사용가능한 계정이어야 합니다.

define ("WATERMARK", "watermark.jpg");

header("Content-type: image/jpeg");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$pic = strip_tags( $_GET['image'] );

$image_url = urldecode($pic);

if (!@fopen($image_url, "r")) {
$dst_img = imagecreatefromjpeg(WATERMARK);
$res = imagejpeg($dst_img, "", 100);
die();
}

$file = pathinfo($image_url);
switch(strtoupper($file["extension"])) {
case "JPG":
$src_img = imagecreatefromjpeg($image_url);
break;
case "GIF":
$src_img = imagecreatefromgif($image_url);
break;
case "PNG":
$src_img = imagecreatefrompng($image_url);
break;
}

$src_w = imagesx($src_img);
$src_h = imagesy($src_img);

$portion = $src_h / $src_w;
$dest_w = 300;
$dest_h = round($dest_w * $portion);

$dst_img = imagecreatetruecolor($dest_w, $dest_h);
imagecopyresized($dst_img, $src_img, 0, 0, 0, 0, $dest_w, $dest_h, $src_w, $src_h);

$watermark = imagecreatefromjpeg(WATERMARK);

$watermark_w = imagesx($watermark);
$watermark_h = imagesy($watermark);

$overlay_img = imagecreatetruecolor($watermark_w, $watermark_h);
imagecopy($overlay_img, $watermark, 0,0,0,0, $watermark_w, $watermark_h);
imagedestroy($watermark);

$white = imagecolorallocate($overlay_img, 0xFF, 0xFF, 0xFF);
imagecolortransparent($overlay_img, $white);

$offsetX = $dest_w - $watermark_w - 3;
$offsetY = $dest_h - $watermark_h - 3;

imagecopymerge($dst_img,$overlay_img,$offsetX,$offsetY,0,0,$watermark_w,$watermark_h, 100);
imagedestroy($overlay_img);

$res = imagejpeg($dst_img, "", 100);
imagedestroy($dst_img);
?>

링크를 허용한 사이트에서는 원본이, 링크를 허용하지 않은 사이트에서는 image.php에 의해 워터마크처리된 이미지로 링크가 걸리게 됩니다. 여기에서는 예를 위해 워터마킹 처리된 이미지의 사이즈를 가로 300으로 고정시켰지만 이 부분은 적당히 소스를 고치시면 원하는 대로 적용시키실 수 있으실 겁니다.



* 스크랩 출처
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로

해상도에 따라 스크롤바가 생기지 않는 최대영역 - 185번째 이야기

Category : 데이터뱅크/Web
익스플로러 기준으로 위에 파일, 편집, 보기, 이런거 있는 메뉴바와
큰 아이콘으로 된 뒤로, 앞으로, 중지 이런것이 있는 도구바, 주소랑
연결이 한줄씩 있을 경우 익스에 가득 차는 크기를 알려 드리겠습니다.

800 x 600 해상도에서는 770 x 416 크기가 익스에 딱 맞아 들어갑니다.
1024 x 786 경우에는 996 x 572 가 맞습니다.
572는 1~2 필셀 정도? 틀릴 수도 있습니다.

1024×768 : (1004 × 617) / 800×600 : (780×449)
Writer profile
author image
LonnieNa 입니다.
http://www.needlworks.org
여러분과 나의 세상에 바라보는 시선을 달리합니다.
위로