2013-11-04 31 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