웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
[추천 강의] [설명] 304번 글에 대한 설명입니다.
2002.12.25 16:45
원본글: 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 코드의 시작을 알립니다. 원래는
* 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 코드의 끝을 알리는 부분입니다.
--------------------------------------------
으윽. 시간 엄청 잡아 먹었군요. 그럼 이만.
- 토끼군
댓글 5
-
[콜록]토끼군
2002.12.25 16:50
-
야호미
2002.12.25 19:07
위에 꺼 하려면 gd 지원 하는 계정이 있어야 겠네요 @.@ gd 에서 gif 지원 되는 계정 으로 -
[콜록]토끼군
2002.12.26 01:56
근데 너무 부하가 많이 걸리죠. :-(
- 토끼군 -
아이쿠
2002.12.25 17:04
^.^ 너무나도 상세한 설명 감사 드립니다.
글을 올려두고 다른짓을 하느라고 덧글을 나중에 확인하였습니다. ^.^ -
Plextor_Zerode
2003.03.11 19:56
토끼군의 글이 원츄 목록이라니 +_+
놀랍네, 토끼군 +_+b
문자열이 출력될 때 이 문자열은 내부적인 위치를 가지고 있습니다. imagettfbbox도 사실은 이 내부적인 위치를 알려 주는 것인데... imagettftext에서 지정된 위치는 문자열의 내부적인 위치에서 (0, 0)에 해당하는 곳으로 인식됩니다. 따라서 만약 이 문자열의 내부적 위치에서 (0, 0)이 문자열 정 가운데에 있다면, 이 문자열을 (0, 0)에 출력한다고 아무리 말을 해도 오른쪽 아랫 부분만 나올 겁니다. 다른 부분은 짤려 버리니깐요.
따라서 imagettfbbox에서 나온 값을 사용해서 이 문자열의 기준점을 알아 내야 합니다. 기준점을 일단 알았다면... 예를 들어서 어떤 문자열을 (50, 50)에 찍으려 하는데 (문자열의 왼쪽 위 꼭지점이 (50, 50)입니다.) 왼쪽 위 꼭지점의 내부적인 위치가 (-3, -5)라면 그 만큼 보정을 해 줘야 겠지요. 따라서 실제로 imagettftext에 값을 넣을 때는 (53, 55)가 되어야 합니다. :-p
으윽. 숙제! (도망간다)
- 토끼군