1

我有一个数组中的单词列表,我可以使用 imagettftext 将其写入 PNG。

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);

正如你所看到的,这段代码目前是相当静态的,也不会将文字限制在图像的大小中(也是我想要的)。

任何帮助将不胜感激,过去两周我一直坚持这一点,真的很想继续前进!

4

2 回答 2

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);

如果您对我所描述的其余部分感兴趣,我可以提供完整的功能。它使用位掩码作为标志。老实说,我不记得它是否很好地处理了角度,但我认为它大部分都做到了。

希望这会有所帮助。

于 2013-11-04T23:46:10.037 回答
0

我花了一段时间,但我想通了......

我是这样做的:

其中 $i 是要写入图像的单词的编号。

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

intersects 方法获取要写入的当前单词、其边界框坐标、start (x,y) 以及已写入图像的先前单词的所有坐标。该方法检查当前要写入的单词是否与此开始 (x,y) 点的任何先前单词相交。

于 2013-11-25T13:33:08.060 回答