본문 바로가기

프로젝트/PHP

php 이미지에 ttf 글씨 쓰기(gd 라이브러리)

php에서 이미지를 편집하는 방법은 여러가지가 있겠지만, 가장 많이 사용하는것은 gd 라이브러리이다. 

기본적으론 disable 상태이기 때문에 이를 허용해주어야한다. 

 

php.ini를 열어서 아래와같이 입력해주자.

extension=php_gd2.dll

 

실제로 허용이 되었는지는 phpinfo.php 파일을 만들고 
<?php phpinfo(); ?>

를 입력한뒤에 아래와 같이 enable상태인지 보면된다.

gd support 설정

위의 이미지와 같아졌다면 gd 라이브러리를 사용할 준비가 끝났다.

 

우선 이미지에 글씨를 작성하는 예시 코드는 아래와같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
    
    header('Content-Type: image/png');
    $string = $_GET['text'];
 
    //이미지 생성하기
    $im = imagecreatefrompng('./common/img/original.png');
 
    //색상 지정하기
    $white = imagecolorallocate($im255255255);
    $grey = imagecolorallocate($im128128128);
    $black = imagecolorallocate($im000);
 
    //폰트 위치(절대경로)
    $font = "C:\Fonts\NotoSansCJKkr-Black.otf";
    
    $fontsize = 16;
    $width = 568;
    $height = 249;
 
    //가운데 정렬
    $strsize = imageftbbox($fontsize0$font$stringarray("linespacing" => 1));
 
    $s_width=$strsize[4];
    $s_height=$strsize[5];
 
    $x = $width/2 - $s_width/2;     
    $y = $height/2 - $s_height/2;
 
    //바탕, 폰트사이즈, 기울기, 가로위치, 세로위치, 색상, 폰트, 내용
    imagettftext($im$fontsize0$x$y$black$font$string);
    
    $date = date("U_u");
    $path = "./common/img/".$date.".png";
    
    //이미지 경로에 생성
    //imagepng($im,$path);
    
    //이미지 화면에 생성
    imagepng($im);
    
    //해제
    imagedestroy($im);
 
    
?>
cs

위의 코드는 text에 받은 문자열을 화면에 가운데 정렬해서 보여준다. 

코드는 쭉 읽다보면 이해가 갈것이다. 이 예제에서 사용한 함수들을 설명하겠다.

 

1. imagecreatefrompng( string $filename ) : 이미지를 gd에서 사용가능한 변수로 생성해준다.

2. imagecolorallocate( resource $image , int $red , int $green , int $blue ) : rgb 형태로 색상을 생성한다.

3. imageftbbox ( float $size , float $angle , string $fontfile , string $text [, array $extrainfo ] ) : 폰트를 적용한 텍스트 박스의 좌표를 배열 형태로 리턴한다.

index information
0 lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

4. imagettftext( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text ) : 폰트를 적용한 글씨를 이미지에 쓴다.

5. imagepng( resource $image [, mixed $to = NULL [, int $quality = -1 [, int $filters = -1 ]]] ) : 이미지를 화면에 띄우거나 지정된 경로에 저장한다.

6. imagedestroy( resource $image ) : 이미지를 할당 해제한다.

 

본 예제를 그대로 사용하면 화면에 내가 매개변수(text)로 준 글씨가 이미지에 써있다. 이를 저장해주고싶으면 주석처리한 imagepng($im,$path); 를 사용하면된다. path로 난 common/img를 사용했고, 파일이름은 생성시각으로 자동생성해주었다. 

 

또한 gd는 매우,, 간단한 라이브러리라 자동정렬 기능이 없다. 정렬을 해주고싶으면 직접 텍스트박스의 크기와 이미지 크기를 가지고 계산해주어야한다. 가로 가운데 정렬은 (가로/2) - (텍스트박스/2) 로 계산해주면된다. 세로도 마찬가지이며 이를 응용하면 오른쪽 왼쪽 정렬도 해줄 수 있다. 

 

참고 : www.php.net/docs.php

'프로젝트 > PHP' 카테고리의 다른 글

ec2에 APM setup하기  (0) 2019.10.28