[PHP] GD 이미지 생성하기


[PHP] GD 이미지 생성하기




최초 작성일 : 2022-03-20 | 수정일 : 2022-05-20 | 조회수 :

이미지처리 작업은 PHP의 기본적인 기능에는 포함되어 있지 않다. 
대신 라이브러리나 외부 프로그램과 연동을 해야 하는데 GD라이브러리가 가장 많이 사용된다.
GD는 기본적으로 사용할 수 있도록 활성화 되어 있는 경우도 있고, 그렇지 않은 경우도 있다.

시스템의 현재 상황을 파악할 수 있는 방법은 phpinfo()를 실행해 보는 것이다.
아래 코드를 실행해보자.

1
2
3
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;



*예제1

아래의 예제를 실행하기 위해서는 button.php과 같은 디렉토리에 button.png 파일이 존재해야 한다. 

편의를 위해서 다음 이미지를 사용하자.


아래와 같이 접근하면 coding이라는 텍스트가 버튼에 표시될 것이다.



코드는 아래와 같다.



1
2
3
4
5
6
7
8
9
10
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);
?>

아래의 예제는 위의 예제를 이용해서 버튼을 실시간으로 생성해주는 예제다.


- 2번 라인의 header('Content-type: image/png');는 php 엔진에서 server로 파일을 전달하거나,

server측에서 client측으로 파일을 전달할 때 해당 파일이 image/png임을 알려주는 역할을 한다.


- 3번 라인의 $string = $_GET['text'];는 사용자가 입력한 입력값을 받는 역할을 한다.


- 4번 라인의 $im = imagecreatefrompng('button.png');는 button.png라는 파일로 부터 이미지를 생성한다는 것을 의미한다.


- 5번 라인$orange = imagecolorallocate($im, 60, 87, 156);은 첫번째 인자로 생성된 이미지를 담은 변수를 주고,

다음으로 각각 빨간색(60), 초록색(87), 파란색(156) 비율을 설정해준다.


- 6번 라인$px = imagesx($im) - 7.5 * strlen($string)) / 2; 는 텍스트가 위치할 좌표를 계산하기 위한 것인데,

구체적으로는 (이미지의 가장 우측 x좌표) - 7.5(가정) * (텍스트의 글자 수) / 2;를 해줌으로써, 텍스트가 정가운데 오게 한다.


- 7번 라인의 imagepng($im);는 이미지를 전송하며,


- 8번 라인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장의 이미지가 있다.



text.png



text.png



original.png

original.png



result.png

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
// 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);
?>


이전 예제와 유사하다.
차이점이 있다면 merge를 통해 텍스트가 경계에 닿는 것을 막고자 한다는 것인데,


$marge_right = 10;

$marge_bottom = 10; 와 같이 지정해줌으로써, 이러한 것이 가능하다.


14번 라인을 상세히 보면 다음과 같다.


imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right,
imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));

위의 경우처럼, imagecopy라는 함수에 첫번째 인자로는 배경이미지의 값을 받은 변수를 저장해준다.

두번째 인자로는 텍스트의 값을 받은 변수를 저장해준다.

세번째 인자와 네번째 인자로는 텍스트가 위치해야할 x좌표와 y좌표를 넣어준다.

5,6,7,8번째 인자로는 텍스트를 이미지로 간주했을 때, 어느정도를 사용할 것인가를 지정해 주면 된다.
(0,0으로 지정할 경우, 이는 텍스트(이미지)의 가장 좌측상단을 의미하며, imagesx($stamp), imagesy($stamp)와 같이
지정해 줄 경우, 가장 끝인 우측하단을 의미한다.)





출처: https://russellhouse.tistory.com/m/60

Tags  #PHP  

닉네임:
댓글내용: