기울기에 따른 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]
어 그래.
고마워
댓글을 작성하시려면 로그인이 필요합니다. 로그인

프로그램

태그 필터 (최대 3개) 전체 개발자 소스 기타 mysql 팁자료실 javascript php linux flash 정규표현식 jquery node.js mobile 웹서버 os 프로그램 강좌 썸네일 이미지관련 도로명주소 그누보드5 기획자 견적서 계약서 기획서 마케팅 제안서 seo 통계 서식 통계자료 퍼블리셔 html css 반응형 웹접근성 퍼블리싱 표준화 반응형웹 홈페이지기초 부트스트랩 angularjs 포럼 스크린리더 센스리더 개발자톡 개발자팁 퍼블리셔톡 퍼블리셔팁 기획자톡 기획자팁 프로그램강좌 퍼블리싱강좌
+
제목 글쓴이 날짜 조회
11년 전 조회 2,951
11년 전 조회 770
11년 전 조회 3,478
11년 전 조회 895
11년 전 조회 784
11년 전 조회 1,077
11년 전 조회 892
11년 전 조회 696
11년 전 조회 1,127
11년 전 조회 1,829
11년 전 조회 1,084
11년 전 조회 844
11년 전 조회 683
11년 전 조회 2,463
11년 전 조회 2,008
11년 전 조회 2,536
11년 전 조회 1,466
11년 전 조회 2,747
11년 전 조회 3,144
11년 전 조회 4,496
11년 전 조회 5,845
11년 전 조회 2,190
11년 전 조회 1,758
11년 전 조회 1,504
11년 전 조회 1,165
11년 전 조회 904
11년 전 조회 1,085
11년 전 조회 979
11년 전 조회 1,455
11년 전 조회 2,262
11년 전 조회 939
11년 전 조회 1,111
11년 전 조회 1,773
11년 전 조회 1,442
11년 전 조회 1,348
11년 전 조회 1,266
11년 전 조회 1,184
11년 전 조회 3,547
11년 전 조회 1,184
11년 전 조회 1,793
11년 전 조회 2,041
11년 전 조회 1,359
11년 전 조회 1,345
11년 전 조회 1,343
11년 전 조회 798
11년 전 조회 1,205
11년 전 조회 1,538
11년 전 조회 1,500
11년 전 조회 874
11년 전 조회 1,224
11년 전 조회 982
11년 전 조회 1,738
11년 전 조회 1,378
11년 전 조회 759
11년 전 조회 2,192
11년 전 조회 6,662
11년 전 조회 1,322
11년 전 조회 1,163
11년 전 조회 1,094
11년 전 조회 956
11년 전 조회 1,485
11년 전 조회 885
11년 전 조회 3,457
11년 전 조회 1,286
11년 전 조회 1,689
11년 전 조회 1,057
11년 전 조회 2,692
11년 전 조회 1,333
11년 전 조회 2,615
11년 전 조회 1,976
11년 전 조회 2,489
11년 전 조회 1,443
11년 전 조회 2,573
11년 전 조회 1,375
11년 전 조회 1,076
11년 전 조회 1,079
11년 전 조회 5,455
11년 전 조회 1,263
11년 전 조회 829
11년 전 조회 794
11년 전 조회 1,146
11년 전 조회 1,495
11년 전 조회 1,911
11년 전 조회 2,220
11년 전 조회 1,128
11년 전 조회 1,448
11년 전 조회 1,389
11년 전 조회 1,029
11년 전 조회 787
11년 전 조회 2,218
11년 전 조회 1,453
11년 전 조회 3,297
11년 전 조회 1,190
11년 전 조회 1,038
11년 전 조회 2,131
11년 전 조회 2,787
11년 전 조회 2,149
11년 전 조회 3,181
11년 전 조회 1,567
11년 전 조회 3,314
🐛 버그신고