문자열의 너비와 높이 구하기

설명.png

대단할것은 없는 강좌이지만,
제 강좌를 출처를 밝히고 외부로 퍼가는 것은 허용하지만,
다른 강좌의 자료나 책의 자료로 사용되거나 부분적인 인용은 허용하지 않습니다.

강좌는 php 5. 대를 기준으로 하며, 이미지 관련을 다룹니다.
이미지에 글을 쓰거나 이미지를 합치거나 하는 등의 내용을 다루어 볼까 합니다.
나중에는 간단한 짤방 만들기 같은 것도 할수 있지 않을까 싶습니다.

이미지관련 > 문자열의 너비와 높이 구하기 

 

이미지에 글자를 쓰는 작업을 할때,
"글자 길이에 상관없이 정확히 중간에 위치시키고 싶다."
"왼쪽 상단에 약간의 공간을 두고 위치 시키고 싶다.
"
등등의 글자 위치에 대한 문제가 발생하곤 합니다.

이런 문제를 해결하기 위해서는
글자가 차지하게 될 너비와 높이를 알아야 하고,
전체 이미지 크기에서 각 포지션에 맞는 좌표점을 찾아내는 것이 필요합니다.


오늘은 제일 먼저 글자의 너비와 높이를 구하는 부분을 다루어 볼까 합니다.

아래의 예제는 제가 알아보기 쉽게 작성한 것입니다.

 

예제2 > study2.php

 

<?php

$font_file = './Daum_Regular.ttf';
$font_size = 20;
$angle = 0;
$string = 'FABCDEFGM';

?>

폰트파일 : <?=$font_file?><br>

폰트크기 : <?=$font_size?> px<br>

기울기 : <?=$angle?><br>

문자열 : <?=$string?><br>
<br>

imageftbbox 함수를 사용하여 받은 결과값
<br>

<?

$array = imageftbbox ( $font_size, $angle, $font_file, $string );

print_r($array);
echo "<br><br>" . PHP_EOL;

?>

Y 좌표에 -1 을 곱한후의 결과값
<br>

<?

$array[1] *= -1;
$array[3] *= -1;
$array[5] *= -1;
$array[7] *= -1;

print_r($array);
echo "<br><br>" . PHP_EOL;

?>

왼쪽 상단의 XY 좌표를 0, 0 으로 변경해 준후의 결과값
<br>

<?

$x_gap = 0;
$y_gap = 0;

$x_gap = $array[0] * -1;
$array[0] += $x_gap;
$array[2] += $x_gap;
$array[4] += $x_gap;
$array[6] += $x_gap;

$y_gap = $array[1] * -1;
$array[1] += $y_gap;
$array[3] += $y_gap;
$array[5] += $y_gap;
$array[7] += $y_gap;

print_r($array);
echo "<br><br>" . PHP_EOL;

?>

문자열이 차지하게 될 너비와 높이는
<br>

<?

$width = $array[4] - $array[0];
$height = $array[5] - $array[1];

?>

너비 : <?=$width?><br>

높이 : <?=$height?><br>

<?

$im = imagecreatetruecolor(200, 200);
$red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

imagefilledrectangle($im, 0, 0, 199, 199, $red);
imagerectangle ( $im , 0 ,0 , $width , $height , $black );
imagefttext($im, $font_size, $angle, 0, $height, $black, $font_file, $string);
imagepng($im, 'temp/1.png');
imagedestroy($im);

?>

<br>
<img src='temp/1.png?<?=time()?>'>
<br>
<br>

왼쪽 상단의 XY 좌표를 조정한후의 결과
<br>

<?

$im = imagecreatetruecolor(200, 200);
$red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

imagefilledrectangle($im, 0, 0, 199, 199, $red);
imagerectangle ( $im , 0 ,0 , $width , $height , $black );
imagefttext($im, $font_size, $angle, 0 - $x_gap, $height - $y_gap, $black, $font_file, $string);
imagepng($im, 'temp/2.png');
imagedestroy($im);

?>

<br>
<img src='temp/2.png?<?=time()?>'>

 

일단 위의 예제를 그대로 복사하여 study2.php 에 저장한다음 브라우져로 일단 확인해보시기 바랍니다.
temp 디렉토리를 생성하여 주시고 linux 같은 경우는 퍼미션을 777 로 주십시오.

 

 

array imageftbbox ( float $size , float $angle , string $fontfile , string $text [, array $extrainfo ] )

전달 받은 글자크기, 기울기, 글자파일, 작성한 문자열을 가지고
이문자열이 차지할 너비와 높이를 직사각형의 좌표로 반환 해 줍니다.

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 => 실제로는 왼쪽 하단

 

그런데 여기서 유의할점은 Y 좌표는 실제 좌표와는 반대로 음수로 나온다는 점입니다.
이유는 아마도 상단에서 위로 그려서 그렇다고 생각됩니다.

 

[첨부된 이미지를 확인하여 주십시오.]

 

글자를 이미지에 쓰게 될때 Y 좌표는 양수로 써야 하며, 위에서 아래로 갈때 0 부터 숫자가 증가하게 됩니다.
그래서 imageftbbox 받은 값의 Y좌표는 모두 곱하기 -1 을 해서 처리합니다.

(실제로는 위아래를 뒤집은 것인데 직사각형이므로 뒤집어도 결과가 같습니다.)


$array[1] *= -1;
$array[3] *= -1;
$array[5] *= -1;
$array[7] *= -1;


그런데 왼쪽 상단의 XY 좌표가 0, 0 이 아닙니다.
우리가 필요한것은 0, 0 으로 부터의 좌표이므로 전체적으로 조정합니다.

$x_gap = 0;
$y_gap = 0;

$x_gap = $array[0] * -1;
$array[0] += $x_gap;
$array[2] += $x_gap;
$array[4] += $x_gap;
$array[6] += $x_gap;

$y_gap = $array[1] * -1;
$array[1] += $y_gap;
$array[3] += $y_gap;
$array[5] += $y_gap;
$array[7] += $y_gap;

이제 실제 문자열이 차지하게될 너비와 높이 를 구합니다.
각 대각의 x 좌표를 빼서 너비를 구하고
각 대각의 y 좌표를 빼서 높이를 구합니다.


$width = $array[4] - $array[0];
$height = $array[5] - $array[1];



bool imagerectangle ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )
대각의 두 xy 좌표를 받아서 직사각형을 그리는 함수 입니다.




우리는 왼쪽 상단에 딱 붙여서 그릴 것이므로
imagerectangle ( $im , 0 ,0 , $width , $height , $black );
와 같이 사용하였습니다.

imagefttext($im, $font_size, $angle, 0, $height, $black, $font_file, $string);
로 같은 위치에 글자를 그렷습니다만. 뭔가 미세하게 박스랑 차이가 납니다.

왼쪽 상단의 XY 좌표가 0, 0 이 아니엇던 것을 주목합니다.
폰트나 글자에 따라 약간의 차이가 있는데 그 좌표에서 문자열을 쓰는 것을 시작해야만

원래 너비나 높이의 문자열이 그려집니다.
따라서 시작점을 조정합니다.

imagefttext($im, $font_size, $angle, 0 - $x_gap, $height - $y_gap, $black, $font_file, $string);

 

 

다음 내용에서는 이미지의 오른쪽 상단, 왼쪽 하단, 오른쪽 하단, 가운데 위치해서 문자열을 그리는 것을 해보겠습니다. 

첨부파일

설명.png (5.2 KB)
0회 2014-07-21 10:23
|

댓글 1개

강좌 예제: https://dbckdghk-c9-terrorboy.c9.io/study/study2.php
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
11년 전 조회 3,539
11년 전 조회 958
11년 전 조회 836
11년 전 조회 1,144
11년 전 조회 945
11년 전 조회 749
11년 전 조회 1,187
11년 전 조회 1,893
11년 전 조회 1,142
11년 전 조회 900
11년 전 조회 750
11년 전 조회 2,511
11년 전 조회 2,061
11년 전 조회 2,591
11년 전 조회 1,524
11년 전 조회 2,797
11년 전 조회 3,198
11년 전 조회 4,551
11년 전 조회 5,899
11년 전 조회 2,241
11년 전 조회 1,815
11년 전 조회 1,557
11년 전 조회 1,219
11년 전 조회 965
11년 전 조회 1,147
11년 전 조회 1,035
11년 전 조회 1,513
11년 전 조회 2,320
11년 전 조회 994
11년 전 조회 1,170
11년 전 조회 1,831
11년 전 조회 1,509
11년 전 조회 1,403
11년 전 조회 1,326
11년 전 조회 1,240
11년 전 조회 3,597
11년 전 조회 1,243
11년 전 조회 1,848
11년 전 조회 2,097
11년 전 조회 1,413
11년 전 조회 1,407
11년 전 조회 1,409
11년 전 조회 864
11년 전 조회 1,264
11년 전 조회 1,594
11년 전 조회 1,562
11년 전 조회 922
11년 전 조회 1,275
11년 전 조회 1,044
11년 전 조회 1,796
11년 전 조회 1,444
11년 전 조회 827
11년 전 조회 2,248
11년 전 조회 6,720
11년 전 조회 1,375
11년 전 조회 1,227
11년 전 조회 1,168
11년 전 조회 1,021
11년 전 조회 1,553
11년 전 조회 936
11년 전 조회 3,508
11년 전 조회 1,348
11년 전 조회 1,754
11년 전 조회 1,121
11년 전 조회 2,753
11년 전 조회 1,401
11년 전 조회 2,674
11년 전 조회 2,039
11년 전 조회 2,559
11년 전 조회 1,510
11년 전 조회 2,632
11년 전 조회 1,441
11년 전 조회 1,138
11년 전 조회 1,135
11년 전 조회 5,517
11년 전 조회 1,340
11년 전 조회 889
11년 전 조회 845
11년 전 조회 1,212
11년 전 조회 1,557
11년 전 조회 1,977
11년 전 조회 2,289
11년 전 조회 1,199
11년 전 조회 1,515
11년 전 조회 1,453
11년 전 조회 1,095
11년 전 조회 854
11년 전 조회 2,286
11년 전 조회 1,524
11년 전 조회 3,358
11년 전 조회 1,263
11년 전 조회 1,099
11년 전 조회 2,205
11년 전 조회 2,854
11년 전 조회 2,210
11년 전 조회 3,255
11년 전 조회 1,633
11년 전 조회 3,378
11년 전 조회 895
11년 전 조회 1,194
🐛 버그신고