2013-11-04 2 views
1

imagettftext를 사용하여 PNG에 쓸 수있는 배열의 단어 목록이 있습니다.PHP : imagettftext & imagettfbbox - 단어의 충돌 감지

imagettfbbox는 다음 단어의 위치를 ​​결정하는 데 사용됩니다.

이미 기록 된 이전 단어와 중복됩니다 이미지에 쓰기를 시도하고 현재 단어 (나는 imagettfbbox 갈 방법 가정?) 만약 내가 확인하고 싶은

이 다음은 나는 코드 (! 나는이 작업을 수행하는 방법에 주위에 내 머리를 얻을 수 없다)과 같을 것이다 가정 무엇 :

If the current word will overlap with previous word 
    Position current word further down an ever increasing spiral until it doesn't collide 

을 순간 내 중복없이 이미지에 대한 모든 단어를 쓸 것입니다 코드 그러나 어떤 각도가없는 (단어 충돌없이 미래에 처리 할 수있는 기능)

$handle = ImageCreate(1000, 500) or die ("Cannot Create image"); 

//Background Colour 
$bg_color = ImageColorAllocate($handle, 0, 150, 255); 
$txt_color = ImageColorAllocate($handle, 0, 0, 0); 

// First we create our bounding box for the first text 
$bbox = imagettfbbox($fontsize, $angle, $font, $word); 

// Set X Coord 
$x = ($bbox[2] - $bbox[0]); 

// Set Y Coord 
$y += ($bbox[7] - $bbox[1]); 

// Write word to image 
ImageTTFText($image, $fontsize, $angle, $x, $y, $txt_color, $font, $word); 

이 코드는 꽤 정적이며 이미지의 크기로 단어를 한정하지 않을 것입니다.

어떤 도움을 주시면 감사하겠습니다. 저는 지난 2 주 동안이 문제에 매달 렸으며 앞으로 나아갈 것입니다!

답변

0

그것은 나에게 동안을했다하지만 이것은 내가 그것을 어떻게입니다

... 그것을 알아 냈 :

$ i가 단어의 수는 이미지에 기록 될

.

do{ 
    $startx += ($i/2 * cos($i)); 
    $starty += ($i/2 * sin($i)); 
}while(intersection($boundingbox, $startx, $starty, $previouscoordinates, $i)); 

교차 부에있어서 기록 할 현재 단어를 얻어, 그 바운딩 박스 좌표 (X, Y) 및 이미지에 기록 된 모든 이전 단어의 시작 좌표. 이 메소드는, 기입 해지는 현재의 단어가이 개시 (x, y) 포인트의 전의 단어와 교차할지 어떨지를 검사합니다.

0

오랫동안이 작업을 수행하지는 않았지만 오래 전에 한 번 이미지 처리 클래스를 작성했습니다. 다음은 비슷한 작업을 수행하는 내 함수의 스 니펫입니다. 내 전체 기능은 실제로 세로, 가운데, 왼쪽/오른쪽 정렬, 굵은 글씨, TTF/비 TTF, 및 단어 래핑 (및 이들의 논리적 조합)을 설명했다. 단어 줄 바꿈이 필요한 경우 문자열에 대한 계산을 수행하고 경계 상자를 사용하기 전에 줄의 배열로 나누어야합니다.

이 코드는 깨진 ​​문자열을 반복하는 foreach 루프 내부에 있습니다. 여기 당신이하는 것처럼 상자 계산을 수행하는 부분이 있습니다. 비슷한 것처럼 보이지만 알고리즘이 약간 다릅니다.

// Calculate Deviation 
$dx = ($box[2] - $box[0])/2 - ($box[2] - $box[4])/2; // Left-Right 
$dy = ($box[3] - $box[1])/2 + ($box[7] - $box[1])/2; // Top-Bottom 

// Some calculations for alignments were here 

// Draw the text 
$success = imagettftext($this->image, $this->settings['font'], (int)$angle, $x, $y, $color, $font_file, $string); 

내가 설명했던 나머지 부분에 관심이 있다면 전체 기능을 제공 할 수 있습니다. 플래그에 비트 마스크를 사용했습니다. 나는 그것이 각도를 너무 잘 정직하게 다루는 지 기억하지 못한다. 그러나 나는 대부분 그것이 한 것이라고 생각한다.

잘하면 도움이됩니다.

+0

나는이 방법을 사용해 보았지만 나에게는 여전히 효과가없는 것 같다. 프로그램에서 수행 한 작업을 더 많이 보여줄 수 있습니까? 감사합니다 – Jon

+0

당신은 그 코드에서'$ dx'와'$ dy'가 결코 사용되지 않는다는 것을 알았습니다 ... 실제로'$ x'와'$ y'에서 빼기는했지만 그 줄은 주석으로 처리되었습니다 그래서 나는 그 문제에 대해 몇 가지 문제가 있는지 궁금해.여기 내 모든 방법이있다. 클래스 변수를 많이 사용하지만 사용자의 요구에 맞게 일치해야하는 항목에 대해 자체적으로 설명해야합니다. 나는 각 줄을 쓴 후에 줄 간격 설정에 의해 증가하는 줄에 더 관심이있을 것이라고 생각한다. 그것은 당신을 위해 잘 주석되어야합니다. http://pastebin.com/HrwNn875 – Demonslay335