웹마스터 팁

GD2를 이용한 그림그리기 스크립트를 이용하여  간단한 버튼 이미지 제작 스크립트로 변경해 보았습니다. 늘 많은 정보를 보기만 하다 하나 올립니다. 압축파일을 열면 2개의 파일이 있습니다. 물론 php를 작동할 수 있는 서버에서 작동합니다. 그리고 2개의 파일이 있는 곳에 'images'라는 폴더를 하나 만들어야 합니다. 그러면 유용하게 사용하였으면 합니다...^^
소스는 압축파일(Create_Image.zip)로 첨부하였습니다.
※ 윈도우플랫폼에 아파치가 설치된 경우입니다. 리눅스의 폰트는 어떻게 사용하는지 잘 몰라서요. 아시는 분 코멘트 부탁드립니다.

입력 폼


<HTML>
<head>
<title>Create Button</title>
<script language="JavaScript">
<!--
// 전송 단추 클릭 시 호출
function img_create(){
var form = document.src_img;
/* if(!form.button_text.value) {
     alert("버픈에 들어갈 문자를 입력하세요!");
     form.button_text.focus();
     return ;
  }*/
if(!form.filename.value) {
     alert("파일 이름을 입력하세요!");
     form.filename.focus();
     return;
  }

form.submit();
}
-->
</script>
<head>
  <title>Create buttons</title>
<head>
<body onLoad="MM_preloadImages('./img/button7_1.gif')">
<table height="540" border="0" cellspacing="0" cellpadding="0" style="table-layout:fixed;border-bottom:1 solid #60829b">
<tr>
<td width="230" style="padding-left:5">
<form method="post" name='src_img' action="make_button.php" enctype='multipart/form-data'>
<table width="230" cellspacing="0" border="0">
<tr>
<th width="230" height="30" align="center" colspan="2" style="border-bottom:1 solid #60829b">
Create buttons
</th>
</tr>
<tr>
<th height="25" align="center" colspan="2">
Image
</th>
</tr>
<tr>
<td colspan="2" align="center" style="border-bottom:1 solid #60829b">
<input type="file" name='img_file' style="width:220;height:20;font-size:7pt;line-height:normal;height:20px">
</td>
</tr>
<tr>
<th height="25" colspan="2" align="center">
Button Size & Color
</th>
</tr>
<tr>
<td width="230" colspan="2" style="padding-left:5">
Width : <input type="text" name="width" size="6" maxlength="6" style="width:63;height:18;font-size:9pt;line-height:normal">
Height : <input type="text" name="height" size="6" maxlength="6" style="width:63;height:18;font-size:9pt;line-height:normal">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center">
margin w : <input type="text" name="w_margin" size="6" maxlength="6" style="width:63;height:18;font-size:9pt;line-height:normal"> 
h : <input type="text" name="h_margin" size="6" maxlength="6" style="width:63;height:18;font-size:9pt;line-height:normal">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center" style="border-bottom:1 solid #60829b">
Red : <input type="text" name="b_red" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
green : <input type="text" name="b_green" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
blue : <input type="text" name="b_blue" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center">
<b>테두리</b> : <input type="radio" name="i_rect" value="y"> 사용   
<input type="radio" name="i_rect" value="n" checked> 없음
</td>
</tr>
<tr>
<th width="230" align="center" colspan="2">
테두리 색상(HEX)
</th>
</tr>
<tr>
<td width="230" colspan="2" align="center" style="border-bottom:1 solid #60829b">
Red : <input type="text" name="l_red" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
green : <input type="text" name="l_green" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
blue : <input type="text" name="l_blue" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center">
<b>선</b> : <input type="radio" name="u_line" value="y"> 사용
<input type="radio" name="u_line" value="n" checked> 없음
</td>
</tr>
<tr>
<td width="115" valign="middle" align="center" style="border-right:1 solid #60829b">
시작점 <input type="text" name="start_x_posi" size="8" maxlength="8" style="width:57;height:18;font-size:9pt;line-height:normal">:x<br />
좌   표 <input type="text" name="start_y_posi" size="2" maxlength="2" style="width:57;height:18;font-size:9pt;line-height:normal">:y
</td>
<td width="110" valign="middle" align="center">
끝 점 <input type="text" name="end_x_posi" size="2" maxlength="2" style="width:57;height:18;font-size:9pt;line-height:normal">:x<br />
좌 표 <input type="text" name="end_y_posi" size="8" maxlength="8" style="width:57;height:18;font-size:9pt;line-height:normal">:y
</td>
</tr>
<tr>
<th width="230" align="center" colspan="2" style="padding-top:5">
선 색상(HEX)
</th>
</tr>
<tr>
<td width="230" colspan="2" align="center" style="border-bottom:1 solid #60829b">
Red : <input type="text" name="s_l_red" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
green : <input type="text" name="s_l_green" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
blue : <input type="text" name="s_l_blue" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center">
Button TEXT : <input type="text" name="button_text" style="width:120;height:20;font-size:9pt;line-height:normal">
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center">
TEXT FONT : 
<font face="돋움" size="2" color="#002C57">
<select name="f_name" size="1" style="width:120;height:20;font-size:9pt;line-height:normal">
<option value="GULIM.TTC" selected>굴림,돋움</option>
<option value="BATANG.TTC">바탕,궁서</option>
<option value="NGULIM.TTF">새굴림</option>
<option value="HMFMOLD.TTF">휴먼옛체</option>
<option value="HMKMMAG.TTF">휴먼매직체</option>
<option value="H2GTRE.TTF">HY견고딕</option>
<option value="H2MJRE.TTF">HY견명조</option>
<option value="H2GSRB.TTF">HY궁서B</option>
<option value="H2GPRM.TTF">HY그래픽</option>
<option value="H2MJSM.TTF">HY신명조</option>
<option value="H2SA1M.TTF">HY얕은샘물</option>
<option value="H2PORL.TTF">HY엽서L</option>
<option value="H2GTRM.TTF">HY중고딕</option>
<option value="H2HDRM.TTF">HY헤드라인</option>
<option value="ARIAL.TTF">Arial</option>
<option value="BKANT.TTF">Book Antiqua</option>
<option value="comic.ttf">Comic Sans MS</option>
<option value="comicbd.ttf">Comic Sans MS Bold</option>
<option value="impact.ttf">IMPACT</option>
<option value="lsansd.ttf">Lucida Sans</option>
<option value="SSERIFE.FON">Ms Sans Serif</option>
<option value="verdana.TTF">Verdana</option>
</select>
</font>
</td>
</tr>
<tr>
<td width="230" height="30" align="center" colspan="2">
<b>Button Text Color(HEX)</b>
</td>
</tr>
<tr>
<td width="230" colspan="2" align="center" style="border-bottom:1 solid #60829b">
Red : <input type="text" name="t_red" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
green : <input type="text" name="t_green" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
blue : <input type="text" name="t_blue" size="2" maxlength="2" style="width:20;height:20;font-size:9pt;line-height:normal" onkeyup="autoTab(this,2,event);">
</td>
</tr>
<tr>
<td width="80" align="right" style="padding-right:10;padding-top:10">
<b>Name</b>
</td>
<td width="80" align="left" style="padding-top:10">
<input type="text" name="filename" size="20" maxlength="20" style="width:80;height:20;font-size:9pt;line-height:normal">
</td>
</tr>
<tr>
<td width="80" align="left">
 
</td>
<td width="80" align="center" style="padding-left:16;padding-top:10">
<a href="javascript:img_create()" onMouseOver="mth_swpImg('Image33','','./img/button7_1.gif',1)" onMouseOut="mth_swpImgRstr()" onfocus='this.blur()'>
<img src="./img/button7.gif" name="Image33" id="Image33" border="0">
</a>
</td>
</tr>
</table>
</form>
</td>
<td width="420" height="540">
<table width="420" border="0" cellpadding="0">
<tr>
<td align="center" valign="absmiddle" bgcolor="#000000" style="border-bottom:1 solid #60829b">
<?
   $src_file = "./images/".$filename.".jpg";        $img_info=@getimagesize($src_file);
   $width = $img_info[0];
   $height = $img_info[1];
   if (($width > 420) && ($width > $height)) {
   $ratio_w = $width / 420;
   $width = $width / $ratio_w;
   $height = $height / $ratio_w;
    } else if (($height > 600) && ($height > $width)) {
    $ratio_h = $heignt / 600;
    $width = $width / $ratio_h;
    $height = $height / $ratio_h;
    }
                
    if($filename){
?>
   <img src='./images/<?=$filename.".jpg" ?>' width="<?=$width?>" height="<?=$height?>" style="border:1 solid #ffffff" vspace="2">
  <? } else { ?>
    
  <? } ?>
</td>
</tr>
<tr>
<td height="520" width="420" valign="top" style="overflow-y:scroll;padding-left:20;padding-top:20;" bgcolor="#000000">
<div style="width:100%;height:100%; overflow:auto;">
<?
   $dir = "./images/";
   // 알고 있는 디렉토리를 열어서, 내용을 읽어들이는 작업입니다.
     if (is_dir($dir)) {
     if ($dh = opendir($dir)) {
    while (($file = readdir($dh)) !== false) {
    $dvd_flnm=explode(".",$file);
    if ($file==".") {
?>
   <font color="#ffffff">.</font><br />
  <?
     } else if ($file==".."){
  ?>
    <font color="#ffffff">..</font><br /><br />
<?
     } else if ($dvd_flnm[1]=="jpg"){
  ?>
<IMG src="./images/<?=$file?>" hspace="1" vspace="1" style="border:1 solid #ffffff" alt="<?=$file?>">
  <?
     }
      }
    closedir($dh);
    }
   }
?>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</HTML>

이미지 제작 스크립트
<meta http-equiv="Content-Type" content="text/php; charset=utf-8">
<?php
//        $img_file = $_REQUEST['img_file'];
//        echo $image_file."<br />";
//        echo $img_file;
//        return;
        //버튼에 입력될 문자
        $button_text = $_REQUEST['button_text'];
        
        // 버튼의 크기
        $width = $_REQUEST['width'];
        $height = $_REQUEST['height'];
        
        // 문자와 버튼 변두리와의 간격
        $w_margin = $_REQUEST['w_margin'];
        $h_margin = $_REQUEST['h_margin'];

        //사각 테두리 &색상
        
        $i_rect = $_REQUEST['i_rect'];
        $l_red = $_REQUEST['l_red'];
        $l_green = $_REQUEST['l_green'];
        $l_blue = $_REQUEST['l_blue'];
        $lc_red = intval(hexdec($l_red));
        $lc_green = intval(hexdec($l_green));
        $lc_blue = intval(hexdec($l_blue));

        //선 색상 좌표
        $u_line = $_REQUEST['u_line'];
        $sx_pos = $_REQUEST['start_x_posi'+ '];
        $sy_pos = $_REQUEST['start_y_posi'];
        $ex_pos = $_REQUEST['end_x_posi'];
        $ey_pos = $_REQUEST['end_y_posi'];
        $s_l_red = hexdec($_REQUEST['s_l_red']);
        $s_l_green = hexdec($_REQUEST['s_l_green']);
        $s_l_blue = hexdec($_REQUEST['s_l_blue']);
//        echo $lc_red."<br />";
//        echo $lc_green."<br />";
//        echo $lc_blue;
//        return;
        // 문자의 폰트네임
        $f_name = $_REQUEST['f_name'];
        
        // 문자색
        $t_red = $_REQUEST['t_red'];
        $t_green = $_REQUEST['t_green'];
        $t_blue = $_REQUEST['t_blue'];
        $tc_red = hexdec($t_red);
        $tc_green = hexdec($t_green);
        $tc_blue = hexdec($t_blue);
        
        // 버튼 배경색
        $b_red = $_REQUEST['b_red'];
        $b_green = $_REQUEST['b_green'];
        $b_blue = $_REQUEST['b_blue'];
        $bc_red = hexdec($b_red);
        $bc_green = hexdec($b_green);
        $bc_blue = hexdec($b_blue);
        
        // 이미지명
        $filename = $_REQUEST['filename'];

        if (empty($button_text) || empty($width) || empty($height))
        {
                echo 'Could not create image - form not filled out correctly';
                exit;
        }

if ($img_file){
                $path="./images/";
        $im = ImageCreateFromJPEG($image_file);
} else {

        // 이미지를 만들고 이미지의 크기를 알아낸다.
        
        $im = ImageCreateTrueColor(intval($width), intval($height));
}

        //echo $l_color;
        //return;
        if ($b_red && $b_green && $b_blue) {
        $color = ImageColorAllocate($im, $bc_red, $bc_green, $bc_blue);
        ImageFill($im, 0, 0, $color);
        }
        //결과
        #Header ('Content-type: image/png');
        #ImagePng($im);
        #return;

        $width_image = ImageSX($im);
        $height_image = ImageSY($im);
if ($i_rect == "y") {
        $l_color = ImageColorAllocate($im, $lc_red, $lc_green, $lc_blue);
        ImageRectangle($im,0,0,$width-1,$height-1,$l_color);
}
if ($u_line == "y") {
        $s_l_color = ImageColorAllocate($im, $s_l_red, $s_l_green, $s_l_blue);
        ImageLine($im, $sx_pos, $sy_pos, $ex_pos, $ey_pos, $s_l_color);
}
        // 이미지의 각 둘레에 18픽셀씩 떨어져서 글자를 채워 넣을 것이다.
        $width_image_wo_margins = $width_image - (2 * $w_margin);
        $height_image_wo_margins = $height_image - (2 * $h_margin);

        // 폰트 크기를 33에서 조금씩 줄여나가서 버튼에 꼭 맞는 크기가 되도록 한다.
        $font_size = 33;

        // 폰트 파일이 있는 위치를 GD2에게 알려준다.
        putenv('GDFONTPATH=C:WINDOWSFonts');
        $fontname = $f_name;

        do
        {
                $font_size--;

                // 지금 폰트 크기를 사용할 때 텍스트의 크기를 알아낸다.
                $bbox=ImageTTFBBox ($font_size, 0, $fontname, $button_text);

                $right_text = $bbox[2];                        // 제일 왼쪽 x 좌표
                $left_text = $bbox[0];                        // 제일 오른쪽 x 좌표
                $width_text = $right_text - $left_text;  // 폭을 잰다.
                $height_text = abs($bbox[7] - $bbox[1]);  // 높이를 잰다.
        }
        while ( $font_size>6 &&
                                 ( $height_text>$height_image_wo_margins ||
                                         $width_text>$width_image_wo_margins )
                                );

        if ( $height_text>$height_image_wo_margins ||
                         $width_text>$width_image_wo_margins )
        {
                // 적절한 폰트 크기를 찾지 못했을 때
                echo 'Text given will not fit on button.<br />';
        }
        else
        {
                // 적절한 폰트 크기를 찾았으므로, 버튼에 글자를 넣는다.

                $text_x = $width_image/2.0 - $width_text/2.0;
                $text_y = $height_image/2.0 - $height_text/2.0 ;

                if ($left_text < 0)
                                $text_x += abs($left_text);    // 왼쪽에 남는 부분을 더한다.
                $above_line_text = abs($bbox[7]);   // 기준선으로부터 얼마나 위에 있는가?
                $text_y += $above_line_text;        // 기준선과의 차이를 더한다.
                
                $text_y -= 2;  // 템플릿의 모양을 위해 값을 조절한다.

         # $white = ImageColorAllocate ($im, 255, 255, 255);
        #        echo "$f_red <br />";
        #        echo "$f_green <br />";
        #        echo "$f_blue";
        #        return;
         $text_color = ImageColorAllocate ($im, $tc_red, $tc_green, $tc_blue);

                ImageTTFText ($im, $font_size, 0, $text_x, $text_y, $text_color, $fontname,
                                                                        $button_text);
        #if (file_exists("./images/".$filename.".jpg")) {
        #                msg_send("같은 이름의  파일이 있습니다.");
                        
        #} else {
                imagejpeg($im, "./images/".$filename.".jpg",100);
        #}
        #  Header ('Content-type: image/png');
        #  ImageJPEG ($im);

        }

        ImageDestroy ($im);
                                echo("<meta http-equiv='Refresh' content='0;  URL=index.html?filename=$filename&width=$width&height=$height'>");
?>

제목 글쓴이 날짜
mysql 안쓰는 간단한 게시판. [20] 제로저아 2007.07.15
주민등록번호 검사기 [7] 이진혁 2007.05.18
PHP스터디시리즈_php프로그램의 기초_연산자1 [1] 에아 2007.04.28
PHP스터디시리즈_php프로그램 기초1 [6] 에아 2007.04.09
PHP스터디시리즈_APM과 PHP의시작 [1] 에아 2007.04.09
아무이유없이 만든 파일 메모장-ㅠ-;; [7] 한태종 2007.02.25
다운로드 이어 받기 및 전송속도 제한 구현 [1] 박원형 2006.12.11
sajax.php 소스 코드 분석 (자세한 한글 주석) 유창화 2006.11.28
간단하게 만들어본 프레임워크 [2] file 유창화 2006.11.27
[PHP 동영상강의] 48. 엑셀파일 db에 넣기, 동적 select 구현 [8] 서기 2006.10.27
[PHP 동영상강의] 47. phpmyadmin 최신버젼 설치하기 [3] 서기 2006.10.27
네이버 메인페지 플래시광고처럼 들갈때마다 바뀌게 하기. [3] 좋은남자 2006.08.30
[팁] 웹언어 개발자를 위한 고객 미디어플레이어 에러해결법 배광한 2006.07.24
PHP로 PDF만들기 1 행복한고니 2006.06.17
GD2를 이용한 간단한 이미지버튼 만들기... file 마땅해 2006.06.13
50줄로 만드는 웹메모 PHP 소스입니다. (웹사이트 포스트잇) [3] file 김성대 2006.05.17
중복파일 검사 후 (숫자)달기... [4] 한치근 2006.04.20
올블로그 명예의 전당글 가져오기 (캐쉬기능추가) [2] 유창화 2006.04.17
올블로그(http://www.allblog.net/Home/) 명예의 전당글 가져오기 [2] 유창화 2006.04.17
네이버 openapi 사용하여 쇼핑검색 만들기 [3] 유창화 2006.04.13