기울기에 따른 imageftbbox 결과값에 대한 비교


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

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

이미지관련 > 기울기에 따른 imageftbbox 결과값에 대한 비교 

 

원래는 이번 내용에서 문자열의 정렬에 대해서 다룰 예정이었습니다.

그러나,
imageftbbox 결과값이 기울기가 있을때 정확하지 않는 부분이 있어서
그것들을 눈으로 보여주고, 앞으로의 내용은 기울기가 없는 상태에서만 다루기 위해서
이번 내용을 다루어 보았습니다.

아래의 예제를 먼저 확인하시기 바랍니다.

 

예제3 > study3.php

 

<?php

header("Content-Type: text/html; charset=UTF-8");



$font_file = './Daum_Regular.ttf';
$font_size = 40;
$string = 'FaggM';
$angles = Array(0, 45, 90, 135, 180, 225, 270, 315, -45, -90, -135, -180, -225, -270, -315);



//그래프를 그리기 위한 용도
$graph_size = 200;
$graph_font_size = 10;



foreach($angles as $k => $angle){

    //그래프용
    $im = imagecreatetruecolor($graph_size * 2, $graph_size * 2);
    $red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
    $blue = imagecolorallocate($im, 0x00, 0x80, 0xFF);
    $white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
    $black = imagecolorallocate($im, 0x00, 0x00, 0x00);

    imagefilledrectangle($im, 0, 0, ($graph_size * 2) - 1, ($graph_size * 2) - 1, $white);
    imageline ( $im , $graph_size , 0 , $graph_size, ($graph_size * 2) - 1 , $blue);//세로선
    imageline ( $im , 0 , $graph_size , ($graph_size * 2) - 1, $graph_size , $blue);//가로선

    imagefttext($im, $graph_font_size, 0, 185, 220, $black, $font_file, '0');
    imagefttext($im, $graph_font_size, 0, 135, 20, $black, $font_file, 'Y축 음수');
    imagefttext($im, $graph_font_size, 0, 135, 390, $black, $font_file, 'Y축 양수');
    imagefttext($im, $graph_font_size, 0, 10, 220, $black, $font_file, 'X축 음수');
    imagefttext($im, $graph_font_size, 0, 340, 220, $black, $font_file, 'X축 양수');



    echo "<strong>기울기가 {$angle}도 일때</strong><br><br>" . PHP_EOL;

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

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

    // $graph_size 을 더한것은 그래프상에서 보여주기 위해서
    imageline ( $im , $array[0] + $graph_size , $array[1] + $graph_size , $array[2] + $graph_size, $array[3] + $graph_size , $blue);
    imageline ( $im , $array[2] + $graph_size , $array[3] + $graph_size , $array[4] + $graph_size, $array[5] + $graph_size , $blue);
    imageline ( $im , $array[4] + $graph_size , $array[5] + $graph_size , $array[6] + $graph_size, $array[7] + $graph_size , $blue);
    imageline ( $im , $array[6] + $graph_size , $array[7] + $graph_size , $array[0] + $graph_size, $array[1] + $graph_size , $blue);

    $x_min = min($array[0], $array[2], $array[4], $array[6]) * -1;
    $y_min = min($array[1], $array[3], $array[5], $array[7]) * -1; 

    //전부 양수가 되도록 오른쪽, 하단으로 밀어내림
    imageline ( $im , $array[0] + $x_min + $graph_size , $array[1] + $y_min + $graph_size , $array[2] + $x_min + $graph_size, $array[3] + $y_min + $graph_size , $black);
    imageline ( $im , $array[2] + $x_min + $graph_size , $array[3] + $y_min + $graph_size , $array[4] + $x_min + $graph_size, $array[5] + $y_min + $graph_size , $black);
    imageline ( $im , $array[4] + $x_min + $graph_size , $array[5] + $y_min + $graph_size , $array[6] + $x_min + $graph_size, $array[7] + $y_min + $graph_size , $black);
    imageline ( $im , $array[6] + $x_min + $graph_size , $array[7] + $y_min + $graph_size , $array[0] + $x_min + $graph_size, $array[1] + $y_min + $graph_size , $black);

    imagefttext($im, $font_size, $angle, $array[0] + $x_min + $graph_size, $array[1] + $y_min + $graph_size, $red, $font_file, $string);

    imagepng($im, 'temp/study3_' . ($k + 1) . '.png');
    imagedestroy($im);

    ?>

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

    <?
}

?>

 

※ 예제를 확인 하실때 temp 디렉토리를 생성하시고 퍼미션을 777 로 주시기 바랍니다.

 

사실 이예제만 가지고도 앞으로 구현 할수 있는 부분들에 대한 많은 가능성을 제시합니다.

 


$angles = Array(0, 45, 90, 135, 180, 225, 270, 315, -45, -90, -135, -180, -225, -270, -315);

 

이것은 기울기에 따라 각각 상황을 보여주기 위해 기울기를 미리 배열로 지정해 놓을 것입니다.

 

$graph_size = 200;
$graph_font_size = 10;

 

$im = imagecreatetruecolor($graph_size * 2, $graph_size * 2);
$red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x80, 0xFF);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

imagefilledrectangle($im, 0, 0, ($graph_size * 2) - 1, ($graph_size * 2) - 1, $white);
imageline ( $im , $graph_size , 0 , $graph_size, ($graph_size * 2) - 1 , $blue);//세로선
imageline ( $im , 0 , $graph_size , ($graph_size * 2) - 1, $graph_size , $blue);//가로선


imagefttext($im, $graph_font_size, 0, 185, 220, $black, $font_file, '0');
imagefttext($im, $graph_font_size, 0, 135, 20, $black, $font_file, 'Y축 음수');
imagefttext($im, $graph_font_size, 0, 135, 390, $black, $font_file, 'Y축 양수');
imagefttext($im, $graph_font_size, 0, 10, 220, $black, $font_file, 'X축 음수');
imagefttext($im, $graph_font_size, 0, 340, 220, $black, $font_file, 'X축 양수');

 

 

기본적으로 보여질 밑그림을 그리는 단계입니다.

좌표값도 있고해서 XY축을 음수 양수 로 구분하여 그렸습니다.

 

bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color )

이 함수는 두점의 XY 좌표를 각각 받아서 1px 짜리의 선을 그어줍니다.

 

imageline ( $im , $array[0] + $graph_size , $array[1] + $graph_size , $array[2] + $graph_size, $array[3] + $graph_size , $blue);


imageline ( $im , $array[2] + $graph_size , $array[3] + $graph_size , $array[4] + $graph_size, $array[5] + $graph_size , $blue);


imageline ( $im , $array[4] + $graph_size , $array[5] + $graph_size , $array[6] + $graph_size, $array[7] + $graph_size , $blue);


imageline ( $im , $array[6] + $graph_size , $array[7] + $graph_size , $array[0] + $graph_size, $array[1] + $graph_size , $blue); 

 

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

을 통해서 받은 네개의 점 좌표를 가지고 순서대로 글자가 위치하게 될 부분을 박스로 표현합니다.

 

각 좌표마다 $graph_size 을 더해 준것은 원래는 의미 없는 부분이나

그림상 가운데 0 인부분을 기준으로 해서 보여주기 위해서 $graph_size 을 더하는 것입니다.

 

$x_min = min($array[0], $array[2], $array[4], $array[6]) * -1;
$y_min = min($array[1], $array[3], $array[5], $array[7]) * -1;


//전부 양수가 되도록 오른쪽, 하단으로 밀어내림

imageline ( $im , $array[0] + $x_min + $graph_size , $array[1] + $y_min + $graph_size , $array[2] + $x_min + $graph_size, $array[3] + $y_min + $graph_size , $black);

 

imageline ( $im , $array[2] + $x_min + $graph_size , $array[3] + $y_min + $graph_size , $array[4] + $x_min + $graph_size, $array[5] + $y_min + $graph_size , $black);

 

imageline ( $im , $array[4] + $x_min + $graph_size , $array[5] + $y_min + $graph_size , $array[6] + $x_min + $graph_size, $array[7] + $y_min + $graph_size , $black);

 

imageline ( $im , $array[6] + $x_min + $graph_size , $array[7] + $y_min + $graph_size , $array[0] + $x_min + $graph_size, $array[1] + $y_min + $graph_size , $black); 

 

이부분이 중요한데

이전 내용에서도 다루었듯이 imageftbbox 의 결과값 좌표에는 음수들이 있습니다.

우리가 이미지 위에 글자를 그려야 하므로 기본적으로 음수가 나오면 안됩니다.

 

이전 내용에서는 기울기가 0 이었기 때문에 아래위가 같은 직사각형이라서

Y 축에 -1 을 곱해서 위아래를 뒤집어서 계산하였습니다.

 

그러나 이번 내용에서는 기울기가 존재하기 때문에

그냥 상하로 뒤집으면 모양이 뒤바뀌게 되어서 그렇게 하면 안됩니다.

 

따라서

X 좌표중 제일 작은 것을 찾고 그것과 0 과의 거리만큼 모든 x 좌표를 조절합니다.

Y 좌표 역시 동일한 방법입니다.

 

위의 예제를 실행하면  

파란색 사각형이 원래 imageftbbox 로 받은 결과값으로 그린 사각형이고

검은색 사각형이 모두 0 을 기준으로 오른쪽이나 하단으로 이동시킨 사각형입니다.

 

결과에서도 나타나듯이 기울기가 0 인 경우를 제외하고는 모두 신뢰할수 없는 결과가 나옵니다.

버그인지 정확한 이유는 모르겟지만......

아무튼 기울기에 따른 문제를 해결하기 위해선

기울기가 0 인것을 기준으로 삼고 여러가지 복잡한 계산식을 사용해 직접 기울기에 맞는 좌표를 구할수 밖에 없습니다.

 

그래서 제가 앞으로 하는 내용에서는 그 부분을 제외하고 기울기가 0 인 상태를 전제로 진행할 예정입니다. 

첨부파일

study3.php (3.4 KB) 8회 2014-07-22 11:26
|

댓글 4개

그동안 있었던 궁금증이 좀 풀렸습니다. 감사합니다.
네 그랫군요.
다행입니다.
예제 바로보기: https://dbckdghk-c9-terrorboy.c9.io/study/study3.php

c9.io를 위하여 수정된 소스 <php 본문내에서 ?>로 닫았다 <?php로 여는것을 허용 안됨에 따라 수정>
// 허용 불가 if, for, foreach 등 php문을 닫았다 열수 없음.(표준 방법에 위배 라네요.)
[code]
<?php
header("Content-Type: text/html; charset=UTF-8");

$font_file = './Daum_Regular.ttf';
$font_size = 40;
$string = 'FaggM';
$angles = Array(0, 45, 90, 135, 180, 225, 270, 315, -45, -90, -135, -180, -225, -270, -315);



//그래프를 그리기 위한 용도
$graph_size = 200;
$graph_font_size = 10;



foreach($angles as $k => $angle){

//그래프용
$im = imagecreatetruecolor($graph_size * 2, $graph_size * 2);
$red = imagecolorallocate($im, 0xFF, 0x00, 0x00);
$blue = imagecolorallocate($im, 0x00, 0x80, 0xFF);
$white = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);
$black = imagecolorallocate($im, 0x00, 0x00, 0x00);

imagefilledrectangle($im, 0, 0, ($graph_size * 2) - 1, ($graph_size * 2) - 1, $white);
imageline ( $im , $graph_size , 0 , $graph_size, ($graph_size * 2) - 1 , $blue);//세로선
imageline ( $im , 0 , $graph_size , ($graph_size * 2) - 1, $graph_size , $blue);//가로선

imagefttext($im, $graph_font_size, 0, 185, 220, $black, $font_file, '0');
imagefttext($im, $graph_font_size, 0, 135, 20, $black, $font_file, 'Y축 음수');
imagefttext($im, $graph_font_size, 0, 135, 390, $black, $font_file, 'Y축 양수');
imagefttext($im, $graph_font_size, 0, 10, 220, $black, $font_file, 'X축 음수');
imagefttext($im, $graph_font_size, 0, 340, 220, $black, $font_file, 'X축 양수');



echo "<strong>기울기가 {$angle}도 일때</strong><br><br>" . PHP_EOL;

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

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

// $graph_size 을 더한것은 그래프상에서 보여주기 위해서
imageline ( $im , $array[0] + $graph_size , $array[1] + $graph_size , $array[2] + $graph_size, $array[3] + $graph_size , $blue);
imageline ( $im , $array[2] + $graph_size , $array[3] + $graph_size , $array[4] + $graph_size, $array[5] + $graph_size , $blue);
imageline ( $im , $array[4] + $graph_size , $array[5] + $graph_size , $array[6] + $graph_size, $array[7] + $graph_size , $blue);
imageline ( $im , $array[6] + $graph_size , $array[7] + $graph_size , $array[0] + $graph_size, $array[1] + $graph_size , $blue);

$x_min = min($array[0], $array[2], $array[4], $array[6]) * -1;
$y_min = min($array[1], $array[3], $array[5], $array[7]) * -1;

//전부 양수가 되도록 오른쪽, 하단으로 밀어내림
imageline ( $im , $array[0] + $x_min + $graph_size , $array[1] + $y_min + $graph_size , $array[2] + $x_min + $graph_size, $array[3] + $y_min + $graph_size , $black);
imageline ( $im , $array[2] + $x_min + $graph_size , $array[3] + $y_min + $graph_size , $array[4] + $x_min + $graph_size, $array[5] + $y_min + $graph_size , $black);
imageline ( $im , $array[4] + $x_min + $graph_size , $array[5] + $y_min + $graph_size , $array[6] + $x_min + $graph_size, $array[7] + $y_min + $graph_size , $black);
imageline ( $im , $array[6] + $x_min + $graph_size , $array[7] + $y_min + $graph_size , $array[0] + $x_min + $graph_size, $array[1] + $y_min + $graph_size , $black);

imagefttext($im, $font_size, $angle, $array[0] + $x_min + $graph_size, $array[1] + $y_min + $graph_size, $red, $font_file, $string);

imagepng($im, 'temp/study3_' . ($k + 1) . '.png');
imagedestroy($im);

$img_num = $k + 1;
$img_time = time();
echo "<br>
<img src='temp/study3_{$img_num}.png?{$img_time}'>
<br><br>";
}

?>
[/code]
어 그래.
고마워
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

+
제목 글쓴이 날짜 조회
11년 전 조회 2,893
11년 전 조회 717
11년 전 조회 3,420
11년 전 조회 834
11년 전 조회 733
11년 전 조회 1,025
11년 전 조회 832
11년 전 조회 639
11년 전 조회 1,067
11년 전 조회 1,778
11년 전 조회 1,024
11년 전 조회 790
11년 전 조회 631
11년 전 조회 2,397
11년 전 조회 1,945
11년 전 조회 2,475
11년 전 조회 1,410
11년 전 조회 2,685
11년 전 조회 3,099
11년 전 조회 4,438
11년 전 조회 5,792
11년 전 조회 2,130
11년 전 조회 1,701
11년 전 조회 1,442
11년 전 조회 1,110
11년 전 조회 850
11년 전 조회 1,024
11년 전 조회 921
11년 전 조회 1,401
11년 전 조회 2,204
11년 전 조회 877
11년 전 조회 1,061
11년 전 조회 1,718
11년 전 조회 1,402
11년 전 조회 1,292
11년 전 조회 1,218
11년 전 조회 1,135
11년 전 조회 3,487
11년 전 조회 1,126
11년 전 조회 1,737
11년 전 조회 1,995
11년 전 조회 1,309
11년 전 조회 1,300
11년 전 조회 1,294
11년 전 조회 753
11년 전 조회 1,151
11년 전 조회 1,486
11년 전 조회 1,456
11년 전 조회 824
11년 전 조회 1,176
11년 전 조회 940
11년 전 조회 1,694
11년 전 조회 1,334
11년 전 조회 714
11년 전 조회 2,141
11년 전 조회 6,617
11년 전 조회 1,274
11년 전 조회 1,121
11년 전 조회 1,051
11년 전 조회 911
11년 전 조회 1,448
11년 전 조회 838
11년 전 조회 3,405
11년 전 조회 1,244
11년 전 조회 1,635
11년 전 조회 1,009
11년 전 조회 2,647
11년 전 조회 1,281
11년 전 조회 2,567
11년 전 조회 1,930
11년 전 조회 2,442
11년 전 조회 1,391
11년 전 조회 2,522
11년 전 조회 1,338
11년 전 조회 1,027
11년 전 조회 1,032
11년 전 조회 5,413
11년 전 조회 1,218
11년 전 조회 781
11년 전 조회 749
11년 전 조회 1,106
11년 전 조회 1,451
11년 전 조회 1,866
11년 전 조회 2,177
11년 전 조회 1,082
11년 전 조회 1,406
11년 전 조회 1,347
11년 전 조회 985
11년 전 조회 746
11년 전 조회 2,170
11년 전 조회 1,414
11년 전 조회 3,249
11년 전 조회 1,150
11년 전 조회 1,010
11년 전 조회 2,093
11년 전 조회 2,749
11년 전 조회 2,108
11년 전 조회 3,141
11년 전 조회 1,530
11년 전 조회 3,272
🐛 버그신고