PHP를 이용해서 이미지를 프로그래밍적으로 생성하고 변경할 수 있다.
GD
이미지처리 작업은 PHP의 기본적인 기능에는 포함되어 있지 않다. 대신 라이브러리나 외부 프로그램과 연동을 해야 하는데 GD라이브러리가 가장 많이 사용된다.
GD의 설치
GD는 기본적으로 사용할 수 있도록 활성화 되어 있는 경우도 있고, 그렇지 않은 경우도 있다. 시스템의 현재 상황을 파악할 수 있는 방법은 phpinfo()를 실행해 보는 것이다. 아래 코드를 실행해보자.
1 2 3 | <?php phpinfo(); ?> |
출력 내용 중에서 특히 중요한 부분은 아래와 같다.
만약 gd가 보이지 않는다면 이를 활성화하거나 설치해야 한다.
php.ini 파일을 열어보고 아래와 같은 부분이 있는지 확인해보자. 만약 아래와 같다면 주석 ;를 제거해준다.
1 | ;extension=php_gd2.dll |
윈도우 버전 Bitnami 사용자
윈도우 버전 bitnami를 사용하고 있다면 php.ini 파일에서 extension_dir 지시자의 값을 아래와 같이 변경해준다. 아래의 설정은 필자의 설정이기 때문에 자신에게 맞는 설정은 직접해주어야 한다.
1 | extension_dir = "D:\BitNami\wampstack-5.4.21-0\php\ext" |
리눅스
우분투처럼 apt-get을 사용할 수 있다면 아래와 같은 명령으로 gd를 설치 할 수 있다.
1 | sudo apt-get install php5-gd; |
예제
아래의 예제를 실행하기 위해서는 button.php과 같은 디렉토리에 button.png 파일이 존재해야 한다. 편의를 위해서 다음 이미지를 사용하자.
아래와 같이 접근하면 coding이라는 텍스트가 버튼에 표시될 것이다.
코드는 아래와 같다.
1 2 3 4 5 6 7 8 9 10 | <?php header( "Content-type: image/png" ); $string = $_GET [ 'text' ]; $im = imagecreatefrompng( "button.png" ); $orange = imagecolorallocate( $im , 60, 87, 156); $px = (imagesx( $im ) - 7.5 * strlen ( $string )) / 2; imagestring( $im , 4, $px , 9, $string , $orange ); imagepng( $im ); imagedestroy( $im ); ?> |
아래의 예제는 위의 예제를 이용해서 버튼을 실시간으로 생성해주는 예제다.
1 2 3 4 5 6 7 8 | < html > < body > < img src = "button.php?text=intro" /> < img src = "button.php?text=member" /> < img src = "button.php?text=history" /> < img src = "button.php?text=mission" /> </ body > </ html > |
실행결과는 아래와 같다.
예제2. 워터마크
이미지에 워터마크를 찍어보자. 아래에 3장의 이미지가 있다.
result.png
text.png를 original.png에 그려서 result.png를 만드는 것이 이번 예제의 목표다. 이를 위해서 text.png와 original.png를 /image 디렉토리에 복사해서 위치시키자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php // Load the stamp and the photo to apply the watermark to $stamp = imagecreatefrompng( 'text.png' ); $im = imagecreatefrompng( 'original.png' ); // Set the margins for the stamp and get the height/width of the stamp image $marge_right = 10; $marge_bottom = 10; $sx = imagesx( $stamp ); $sy = imagesy( $stamp ); // Copy the stamp image onto our photo using the margin offsets and the photo // width to calculate positioning of the stamp. imagecopy( $im , $stamp , imagesx( $im ) - $sx - $marge_right , imagesy( $im ) - $sy - $marge_bottom , 0, 0, imagesx( $stamp ), imagesy( $stamp )); // Output and free memory header( 'Content-type: image/png' ); imagepng( $im ); imagedestroy( $im ); ?> |