📜  imagettftext 自动换行 (1)

📅  最后修改于: 2023-12-03 15:31:22.540000             🧑  作者: Mango

imagettftext自动换行

imagettftext 是PHP中图像处理函数之一,可以在图像上绘制TureType字体的文本。然而,当绘制超出画板宽度或长度的文本时,会覆盖画板之外的区域。因此,我们需要找到一种方法来使文本自动换行以适应画板的大小。

解决方案

以下是使用imagettftext()实现自动换行的步骤:

  • 首先,将文本拆分为单个单词或字符,并将它们存储在数组中,可以使用 explode( ' ', $text ) 函数将文本按照空格分割成数组。

  • 接下来,遍历数组,检查当前单词或字符是否可以适合当前行中。如果当前行中的字符加上当前单词的长度小于画板宽度,则将单词添加到当前行中。否则,创建新行将单词添加到新行中。

  • 为了避免文本太接近图像底部,我们需要在超过一定阈值的时候停止文本渲染。

  • 最后,利用imagettftext()foreach 循环生成文本并绘制到画布上。

以下是实现自动换行的示例代码片段:

// 设置画布大小
$image_width = 500;
$image_height = 500;

$font_size = 20;
$font_path = "/path/to/font.ttf";
$font_color = imagecolorallocate($image, 255, 255, 255);

// 要绘制的文本
$text = "This is a sample text to demonstrate automatic line breaks in imagettftext.";

// 将文本拆分成单词
$words_array = explode(' ', $text);

// 初始化文本行,存储换行后的单词和长度
$current_line = '';
$current_line_length = 0;
$lines_array = array();

// 设置限制条件,防止文本过于接近图像底部
$max_y_position = $image_height - ($font_size * 2);

foreach ($words_array as $word) {
    // 检查当前行加上当前单词长度是否超过画板宽度
    $box = imagettfbbox($font_size, 0, $font_path, $current_line . ' ' . $word);
    $width = $box[2] - $box[0];

    if (($current_line_length + $width) < $image_width) {
        // 如果没超过则将单词加入当前行
        $current_line .= ' ' . $word;
        $current_line_length += $width;
    } else {
        // 如果超过了,则将当前行加入 $lines_array, 并重置当前行和当前行长度变量
        $lines_array[] = trim($current_line);
        $current_line = $word;
        $current_line_length = imagettfbbox($font_size, 0, $font_path, $current_line)[2] - 
        imagettfbbox($font_size, 0, $font_path, $current_line)[0];
    }

    // 防止文本过于接近画布下部
    if ((count($lines_array) * $font_size) > $max_y_position) {
        $lines_array[] = '...';
        break;
    }
}

// 将最后一行加入 $lines_array
if (!empty($current_line)) {
    $lines_array[] = trim($current_line);
}

// 将文本绘制到画布上
$start_y_position = round(($image_height - (count($lines_array) * $font_size)) / 2);

foreach ($lines_array as $line) {
    $box = imagettfbbox($font_size, 0, $font_path, $line);
    $width = $box[2] - $box[0];
    $start_x_position = round(($image_width - $width) / 2);

    imagettftext($image, $font_size, 0, $start_x_position, $start_y_position, $font_color, $font_path, $line);
    $start_y_position += $font_size;
}

// 输出图像
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
结论

在PHP应用程序中,imagettftext是一个非常有用的函数,特别是当需要在图像上绘制文本时。通过使用上述所述的步骤,我们可以使文本在画布大小之内自动换行并使用imagettftext自动渲染到图像上。