2013-11-04 28 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); 

這個代碼在你看的時候是非常靜態的,並且不會將單詞限制在圖像的大小(也是我想要的)。

任何幫助將不勝感激,我一直堅持在這個過去兩週,並真的想繼續前進!

回答

0

我花了一段時間,但我想它了...

這是我做的:

其中$ i是要寫入圖像字的數量。

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

intersects方法對當前的字被寫入,它的邊框座標,開始(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