웹마스터 팁

원본글: http://www.nzeo.com/bbs/zboard.php?id=p_study&no=591



설명 해달라고 하셨지요? 답변이 안 달려서 그냥 글 올립니다 -_-;; (이런;)

한 줄씩 설명해 보겠습니다.

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

* PHP 코드의 시작을 알립니다. 원래는
* Header("Content-type: image/gif");
문서의 MIME 형식을 설정하는 겁니다. MIME는 파일의 형식을 나타내는 것으로, 예를 들자면 text/plain은 보통 텍스트 파일, text/html은 우리가 많이 보는 HTML 파일, image/gif는 GIF 그림 파일... 등등으로 세분화 되어 있습니다.
MIME는 HTTP Header라는 특별한 곳에 지정해야 합니다. (보통 헤더라고들 많이 하죠) 이건 문서가 보내지기 전에 문서의 정보를 보내기 위해서 쓰는 곳인데, 따로 안 정해 주면 알아서 처리합니다. (GIF, JPEG 파일들에 따로 이상한 거 붙이는 거 보셨나요?;) 하지만 PHP 파일은 보통 일괄적으로 text/html로 처리하기 때문에 이를 바꿔 줘야 합니다. 따라서 위 명령으로 MIME 형식을 강제로 image/gif로 바꾸는 겁니다.
물론 image/jpeg(JPEG), image/png(PNG)도 있습니다. :-p

* if(!isset($s)) $s=11;
isset라는 함수부터 알고 넘어 가야 하는데, 이 함수는 들어온 변수에 뭔가가 있는 지를 알아 보는 데 씁니다. $s라는 변수에 뭔가가 있으면 isset($s)는 TRUE, 아니면 FALSE를 나타냅니다.
만약 s가 들어 오지 않았으면 당연히 $s는 비어 있을 것이겠지요. 그런데 그 상태에서 바로 문자열을 출력하려고 하면 당연히 오류가 나겠지요 ;ㅁ; 따라서 $s가 없으면 자동으로 $s에 기본값(여기서는 11)을 집어 넣어야 합니다.
isset($s)가 참(TRUE)이면 $s에 뭔가가 있단 얘기니까, !isset($s)가 거짓(FALSE)일 때 $s에는 아무 것도 없습니다. 따라서 !isset($s)가 거짓이면(= s가 들어 오지 않으면) $s를 11로 설정해 버리는 겁니다.

* $size = imagettfbbox($s,0,"/fonts/TIMES.TTF",$text);
imagettfbox라는 함수가 나왔습니다. 자세한 설명은 PHP 레퍼런스를 뒤지심이 낫겠지만 영어라서 뒤지기 곤란하므로 간단히 설명하겠습니다. 이 함수는 주어진 TTF 파일로 어떤 문자열을 출력할 때 출력된 문자열의 크기를 알려 주는 함수인데요. 첫째 인자가 크기, 둘째 인자가 돌릴 각도(설명하기 곤란하므로 생략합니다. 0이라고 하면 보통 쓰는 대로 나옵니다), 셋째 인자가 출력할 TTF 글꼴 파일의 위치, 넷째 인자가 출력할 문자열입니다.
이 함수는 배열로 값을 반환하는데, 각각 문자열이 들어 있는 직사각형의 네 꼭지점의 좌표를 나타냅니다. 처리에 대해서는 다음 문을 봅시다.

* $dx = abs($size[2]-$size[0]);
* $dy = abs($size[5]-$size[3]);
$size로 반환된 꼭지점들의 좌표를 써서 문자열의 폭과 높이를 구하는 작업입니다. imagettfbbox에서 반환하는 배열은 다음과 같은 값을 갖고 있습니다. (요 배열의 이름을 $size라 합시다;)
- 왼쪽 아래 꼭지점: 가로 좌표 = $size[0], 세로 좌표 = $size[1]
- 오른쪽 아래 꼭지점: 가로 좌표 = $size[2], 세로 좌표 = $size[3]
- 오른쪽 위 꼭지점: 가로 좌표 = $size[4], 세로 좌표 = $size[5]
- 왼쪽 위 꼭지점: 가로 좌표 = $size[6], 세로 좌표 = $size[7]
시계 반대 방향으로 가는 군요. -_-; 따라서 아래와 위의 세로 좌표 차이를 구하면 높이요, 왼쪽과 오른쪽의 가로 좌표 차이를 구하면 폭이 되겠지요. :-p
abs는 절대값을 구하는 함수입니다. 쉽게 말해서 숫자에 -가 붙으면 떼어 내는 함수지요. 폭과 높이가 음수가 될 리가 없으니까 음수가 나오면 -를 떼어 내야 하겠지요?

* $xpad=9;
* $ypad=9;
그냥 이 문장만 보면 이해하기 힘들군요. -_-; 아래 문장을 보고 알았는데, 요 문장이 하는 짓이 뭐냐 하면... 문자열을 출력할 때 사방에 일정한 간격을 띄워 주는 부분입니다. 그러니까 문자열의 원래 크기가 150x35라면 실제로 출력될 때 이미지의 크기는 159x44겠군요.

* $im = imagecreate($dx+$xpad,$dy+$ypad);
드디어 이미지를 만들어 냅니다. 띄우는 공간까지 고려해서 하려면 당연히 폭과 높이에 각각 $xpad와 $ypad를 더해 주어야 겠지요.
imagecreate는 이미지를 만드는 함수인데, (실제 출력은 나중에-_-) 첫째 인자가 폭, 둘째 인자가 높이입니다...라는 건 대충 눈치채실 겁니다. 여기서 반환되는 값은 실제로 이미지를 만들기 위해서 꼭 써야 하는 값이므로 무조건 어딘가에 저장하시고 쓰셔야 합니다 -_-; (아래를 보셔도 알겠지만, $im이라는 변수를 계속 집어 넣고 있습니다;)

* $blue = ImageColorAllocate($im, 0x2c,0x6D,0xAF);
* $black = ImageColorAllocate($im, 0,0,0);
* $white = ImageColorAllocate($im, 255,255,255);
imagecolorallocate 함수는 정해진 이미지에다가 색깔을 할당하는 함수입니다. 할당되지 않은 색깔은 쓸 수 없습니다. 첫째 인자가 imagecreate에서 나온 값(그러길래 변수에다가 넣으라고 하셨잖습니까;)이고, 둘째, 셋째, 넷째 인자는 각각 빨강, 초록, 파랑입니다. (0부터 255까지) 나오는 값은 할당된 색깔의 번호이고, imagecreate와 같이 따로 저장해야 합니다 :-p
"근데 첫 문장의 0x가 뭐에요?"하면... 0x를 붙이면 그 숫자는 16진수로 인식됩니다. 0xFF 하면 255가 되는 거지요. 이 프로그램을 만든 사람이 10진수로 바꾸기 귀찮다고 0x만 붙인 모양이군요 -_-;

* ImageRectangle($im,0,0,$dx+$xpad-1,$dy+$ypad-1,$black);
* ImageRectangle($im,0,0,$dx+$xpad,$dy+$ypad,$white);
imagerectangle 함수는 직사각형을 그리는 함수입니다. 첫째 인자가 역시 imagecreate에서 나온 값(정확하게 말해서는 이미지 리소스라고들 합니다;)이고, 둘째, 셋째 인자는 직사각형의 왼쪽 위 꼭지점 좌표(가로, 세로 순서)이고, 넷째, 다섯째 인자는 직사각형의 오른쪽 아래 꼭지점 좌표입니다. 여섯째 인자는 당연히 색깔이지요.
그냥 봐서는 잘 몰랐는데, 배경에 다른 색깔을 입히고 보니 확실히 보였습니다. 이 부분은 이미지를 튀어나오게 보이려고 만든 것으로, 첫째 문장이 오른쪽과 아랫쪽 변의 검은 색깔, 둘째 문장이 왼쪽과 윗쪽 변의 흰 색깔을 위한 부분입니다. 직접 생각해 보시면 간단히 이해할 수 있겠습니다. (설명 해달라는 분은...;;)

* ImageTTFText($im, $s, 0, (int)($xpad/2)+1, $dy+(int)($ypad/2), $black, "/fonts/TIMES.TTF", $text);
* ImageTTFText($im, $s, 0, (int)($xpad/2), $dy+(int)($ypad/2)-1, $white, "/fonts/TIMES.TTF", $text);
imagettftext는 주어진 TTF 파일로 주어진 문자열을 주어진 위치에다가 주어진 색깔로 출력하는 함수입니다. (헥헥) 첫째 인자는 이미지 리소스, 둘째 인자는 크기, 셋째 인자는 각도, 넷째, 다섯째 인자는 출력할 위치, 여섯째 인자는 색깔, 일곱째 인자가 출력할 TTF 글꼴 파일 주소, 여덟째 인자가 바로 출력할 문자열입니다.
이 역시 튀어 나온 효과를 주기 위해서 두 개를 쓰고 있습니다. 일단 실제 문자열에서 1픽셀씩 아랫쪽과 오른쪽으로 가서 검정 문자열을 출력하고, 원래 위치에서 흰 문자열을 출력합니다. 첫 문자열은 거의 모두 둘째 문자열에 가려 버리지만, 약간 차이가 있기 때문에 튀어 나온 부분이 있겠지요. 그 튀어 나온 부분이 그림자 효과(혹은 튀어 나온 효과)를 주는 거지요.
...자세한 설명은 귀찮아서 생략합니다; 직접 해 보는 것이 가장 쉬운 방법이지요. (아. 이 함수 제대로 안 먹을 때도 있습니다. TTF 파일에 따라서 다른데... 이건 나중에 설명하지요;)

* ImageGif($im);
imagegif는 첫째 인자에 들어 온 이미지 리소스를 GIF로 출력하는 함수입니다. 같은 계열의 함수로 imagepng, imagejpeg 따위가 있습니다. -_-; (헤더도 그에 따라서 바뀌어야 겠지요.) 따라서 이 부분은 실제로 출력하는 부분 되겠습니다.

* ImageDestroy($im);
이미지를 만들면 지워 줘야 겠지요. imagedestory는 만들어진 이미지 리소스를 없애는 함수입니다. 반드시 이렇게 처리를 해 주는 습관을 기릅시다;

* ?>
PHP 코드의 끝을 알리는 부분입니다.

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

으윽. 시간 엄청 잡아 먹었군요. 그럼 이만.

- 토끼군
제목 글쓴이 날짜
[동주아빠] PHP 게시판(27강) - 수정(modify_ok.php) 손병목 2003.01.11
[동주아빠] PHP 게시판(26강) - 수정(modify.php) 손병목 2003.01.11
웹서핑중 구했습니다. 조그만 달력.. [6] file 황선규 2003.01.10
[1분짜리 팁] 절대경로 알아내기! [14] 찐군 2003.01.09
access 자료(mdb) 를 MySQL로 변환하는 방법 [8] 황선규 2003.01.06
[동주아빠] PHP 게시판(25강) - 내용 보기 기능(3) 설명 [1] 손병목 2003.01.04
[동주아빠] PHP 게시판(24강) - 내용 보기 기능(2) view.php 소스 file 손병목 2003.01.04
[동주아빠] PHP 게시판(23강) - 내용 보기 기능(1) view.php 디자인 손병목 2003.01.04
국내 IP정보를 조회하는 클래스 [7] 행복한고니 2003.01.04
이미지를 HTML table tag로 변환. [7] file 민이 2002.12.31
SQL질의어를 DB에 입력하는 팁 [4] 최후의성전 2002.12.31
[동주아빠] PHP 게시판(22강) - 목록 보기(5) list.php 설명(下) [1] 손병목 2002.12.30
[동주아빠] PHP 게시판(21강) - 목록 보기(4) list.php 설명(中) 손병목 2002.12.30
[동주아빠] PHP 게시판(20강) - 목록 보기(3) list.php 설명(上) 손병목 2002.12.30
[동주아빠] PHP 게시판(19강) - 목록 보기(2) list.php 소스 [3] file 손병목 2002.12.29
[동주아빠] PHP 게시판(18강) - 목록 보기(1) list.php 화면 디자인 손병목 2002.12.29
[추천 강의] NZEO.COM 에서 쓰는 북마크 구현하기 [5] 東氣號太 2002.12.28
폼메일 --- 제로님 예전 폼메일 수정 변경.. [11] uropa™ 2002.12.27
[추천 강의] [설명] 304번 글에 대한 설명입니다. [5] [콜록]토끼군 2002.12.25
[동주아빠] PHP 게시판(17강) - 저장 후 페이지 이동 손병목 2002.12.25