php로 이미지 다루기
php는 포토샵처럼 동적으로 이미지를 다룰 수 있다. 그 기본적인 방법에 대해서 이야기해보려고 한다.
php에는 기본적으로 이미지를 다룰 수 있는 기능은 포함되어 있지 않으므로, 라이브러리나 외부 프로그램과 연동을 해줘야 한다.
제일 많이 쓰이는 라이브러리가 GD라이브러리이다.
기본적으로, php 자체에 GD 라이브러리를 사용할 수 있도록 설치가 되어있는 경우도 있고, 되어있지 않은 경우도 있는데 이를 확인하기 위해 먼저 phpinfo() 명령어를 실행해준다.
<?php
phpinfo();
?>
이 명령어를 실행해주면 설치된 php에 대한 정보들이 뜬다. 이중 gd 라이브러리와 관련된 부분이 있는지 확인해준다.
이렇게 gd와 관련된 내용이 존재하고 GD Support가 enabled로 되어있으면 별도의 설치없이 라이브러리를 사용할 수 있다. GIF, JPEG, PNG 등을 지원하는지도 확인할 수 있다.
버튼 이미지에 직접 text를 집어넣을건데 그러려면 동적으로 png를 생성해줄 php와 .png 확장자를 가진 이미지가 같은 폴더에 담겨있어야 한다.
<?php
header("Content-type: image/png");
//HTTP 프로토콜과 관련! 서버가 클라이언트의 요청에 응답할 때 헤더에 정보를 포함시키는 함수
//위 코드는 Content-type이 image/png다 라는 것을 알려주고 클라이언트가 그에 따라 해석을 함
//header는 특수한 함수라서 제일 위에 위치해야함! echo와 같은 데이터와 관련된 명령어를 먼저 적으면 안됨 공백도 안됨(공백도 데이터이기 때문에)
$string = $_GET['text'];
//get 방식을 호출할 때 text이름의 변수에 담긴 값을 string변수에 담아라
//밑의 함수들은 gd Library에 담겨있는 내장 함수
$im = imagecreatefrompng("button.png"); //같은 폴더에 존재
//png로 이미지를 만들 것이라는 정보를 정의하는 명령어(.png로 끝나는 이미지 이름을 작성)
$color = imagecolorallocate($im, 60, 87, 156);
//이미지 색을 할당하는 명령어(img에 대한 식별자, red, green, blue)
$px = (imagesx($im) - 7.5 * strlen($string)) / 2;
//text를 가운데에 놓기 위한 x축 식(전체 이미지의 길이에서 text의 길이를 빼고 /2를 해주면 됨)
//7.5를 빼는 이유는 텍스트 하나의 크기가 대력 7.5라서 임의로 작성해둔 값! 정확한 값은 아님
imagestring($im, 4, $px, 9, $string, $color);
//이미지에 글씨를 적는 명령어(글씨를 적고자하는 img식별자, 폰트, 글씨를 넣고자하는 x축의 값, y축의 값, 넣고자하는 글씨, 색깔)
imagepng($im); //png 형식의 이미지를 전송한다 (실제 이미지가 작성되는 지점)
imagedestroy($im); //$im의 자원을 해제해주는 명령어
?>
코드와 주석을 달아 각각의 명령어에 대한 설명을 적어뒀다. 이후에 주소창에 localhost/file/img/btn.php?text=code 를 입력해주면 text= 이후에 적혀있는 text 내용이 화면에 출력될 것이다.
이렇게! 그러나 php를 이용해 이미지를 생성하고 편집하는 것은 포토샵을 이용하는 것처럼 컴퓨터의 성능에 좋지는 않다. 정적으로 이미지를 제어하고 관리해도 상관없는 때에는 굳이 php를 이용해서 동적으로 이미지를 제어할 이유가 없다. html만을 이용해 정적인 이미지를 다루는 방법도 존재한다.
<html>
<body>
<img src="btn.php?text=intro" />
<img src="btn.php?text=member" />
<img src="btn.php?text=history" />
<img src="btn.php?text=mission" />
</body>
</html>
이렇게 html 코드를 이용해서 text 값을 직접 입력하면 php로 만들어준 것과 같은 결과를 얻을 수 있다.
localhost/file/img/btn.html만 호출해주면 이러한 화면이 나올 것이다.