PHP: создайте блок изображения, высота которого зависит от содержащегося в нем текста - PullRequest
2 голосов
/ 21 декабря 2011

Я пытаюсь использовать PHP для создания изображения прозрачного текстового поля с макс. 2 строки текста. Ширина окна фиксирована на уровне 90 пикселей; высота варьируется в зависимости от содержимого текста (опять же, текст может занимать от 1 до 2 строк): пример .

Я думаю, что самая сложная часть - это как "автоматически" установить высоту блока в зависимости от длины текста. То есть скрипт должен быть достаточно умным, чтобы:

  1. Перенос текста (до 2-й строки), если он длиннее ширины.
  2. Отрегулируйте высоту поля, потому что теперь есть две линии.

Предполагая, что текст всегда занимает одну строку и поле, сценарий может быть довольно простым:

<?php
$im = imagecreatetruecolor(90, 22);
$white = imagecolorallocate($im, 255, 255, 255);
$blue = imagecolorallocate($im, 92, 149, 167);

// Set the background to be blue
imagefilledrectangle($im, 0, 0, 90, 22, $blue);

// Path to our font file
$font = './Arial.ttf';

imagefttext($im, 10, 0, 5, 15, $white, $font, "Barton Hotel");

// Output to browser
header('Content-Type: image/png');

imagepng($im);
imagedestroy($im);
?>

1 Ответ

0 голосов
/ 21 декабря 2011

используйте imagettfbox , чтобы получить ограничивающую рамку текста, и используйте эту информацию для фактического создания рамки.

У меня есть эта функция для генерации изображения слова:

function generate_words($word)
{
    $fontSize = 10;
    $fontFile = dirname( __FILE__ ) . '/fonts/verdana.ttf';
    $boundingBox = imagettfbbox($fontSize, 0, $fontFile, $word);
    $imageWord = imagecreate(abs($boundingBox[2]) + abs($boundingBox[0]), abs($boundingBox[7]) + abs($boundingBox[1]));
    $background = imagecolorallocate($imageWord, 255, 255, 255);
    $black = imagecolorallocate($imageWord, 0, 0, 0);
    imagettftext($imageWord, $fontSize, 0, 0, abs($boundingBox[5]), $black, $fontFile, $word);
    //print_r( $boundingBox );

    return $imageWord;    
}

Используйте это следующим образом:

$imageWord = generate_words( "my text" );
$imageWordWidth = imagesx($imageWord);
$imageWordHeight = imagesy($imageWord);

и, наконец, объедините полученный текстовый ресурс изображения в базовое или фоновое изображение:

imagecopymerge($baseImage, $imageWord, $wordXLocationRelativeToBase, $wordYLocationRelativeToBase, 0, 0, $imageWordWidth, $imageWordHeight, 100);
...