Я накладываю текст на изображение, используя GD lib. Я хочу обернуть строку в ограничивающий прямоугольник и получить максимально подходящий для текста.
Вот что у меня так далеко:
//dimension of the image I'm placing the text on
$img_w = imagesx($this->img);
$img_h = imagesy($this->img);
//Get the dimensions of the text bounding box
$bbox = imagettfbbox($size, 0, $font, $text);
$w = (abs($bbox[2])+(abs($bbox[0])));
$h = (abs($bbox[5])+(abs($bbox[3])));
Далее мне нужно сделать несколько проверок. Если $w > $img_w
тогда я хочу добавить разрыв строки в середине строки. Тогда проверь $w > $img_w
снова. Если он все еще слишком велик, разделите его на трети и так далее, пока он не уместится в пределах ширины изображения.
Мне также нужно проверять каждый раз, когда я добавляю разрыв строки, если $ h> $ img_h. Если это правда, то у меня не хватает места, чтобы уместить текст на изображении такого размера. Поэтому мне нужно начать уменьшать размер текста, пока он не подойдет.
Вы можете увидеть что-то идентичное тому, чего я хочу достичь здесь: http://memegenerator.net/Instagram
У меня есть рекурсивный метод для получения размера текста, чтобы я мог отцентрировать его на изображении, когда я перекрываю его:
private function get_text_size($size, $font, $text){
//dimension of the image I'm placing the text on
$img_w = imagesx($this->img);
$img_h = imagesy($this->img);
//Get the dimensions of the text bounding box
$bbox = imagettfbbox($size, 0, $font, $text);
//add some space around the text too
$w = (abs($bbox[2])+(abs($bbox[0]));
$h = (abs($bbox[5])+(abs($bbox[3]));if( $w > $img_w ){
//split string in half
$tmp = explode(' ', $text);
$word_count = (count($tmp)/2);
$tmp[$word_count] .= "\n";
//rebuild the string with the line break(s) and check the size again.
$text = '';
foreach($tmp as $word){
$text .= $word.' ';
}
return $this->get_text_size($size, $font, $text);
}
return array($size, $w, $h);
}
Это просто застревает в бесконечном цикле, как будто разрыв строки не работает. Я проверил похожие вопросы (Как добавить разрыв строки в средней точке строки, разделенной пробелами, Оберните строки текста в пределах изображения, используя GD) но никто из них действительно не решает эту проблему.
Я ожидал, что для этого будет простая функция, но я не могу ее найти и не могу найти лучший способ сделать это.
У меня были те же проблемы, и я нашел эту библиотеку PHP:
https://github.com/kus/php-image
Что помогает обернуть текст в текстовое поле, вы можете установить его так (Скопировать и изменить из примера разработчика):
$background = 'image/background.jpg';
$image = new PHPImage();
$image->setDimensionsFromImage($background );
$image->draw($background );
$image->setFont('font/arial.ttf');
$image->setTextColor(array(255, 255, 255));
$image->setStrokeWidth(1);
$image->setStrokeColor(array(0, 0, 0));
$image->textBox('Auto wrap and scale font size to multiline text box width and height bounds. Vestibulum venenatis risus scelerisque enim faucibus, ac pretium massa condimentum. Curabitur faucibus mi at convallis viverra. Integer nec finibus ligula, id hendrerit felis.', array(
'width' => 150,
'height' => 140,
'fontSize' => 16, // Desired starting font size
'x' => 50,
'y' => 150
));
$image->show();
//$image->save("image/temp.jpg");//If you want to save image instead of show it
Других решений пока нет …