Использование PHP GD для создания текста формы изображения с разными шрифтами

Я использую этот простой скрипт для генерации картинок из текста:

<?php
header('Content-type: image/png');

$color = RgbfromHex($_GET['color']);

$text = urldecode($_GET['text']);

$font = 'arial.ttf';

$im = imagecreatetruecolor(400, 30);

$bg_color = imagecolorallocate($im, 255, 255, 255);

$font_color = imagecolorallocate($im, $color[0], $color[1], $color[2]);

imagefilledrectangle($im, 0, 0, 399, 29, $bg_color);

imagettftext($im, 20, 0, 10, 20, $font_color, $font, $text);

imagepng($im);

imagedestroy($im);

function RgbfromHex($hexValue) {
    if(strlen(trim($hexValue))==6) {
        return array(
                     hexdec(substr($hexValue,0,2)), // R
                     hexdec(substr($hexValue,2,2)), // G
                     hexdec(substr($hexValue,4,2))  // B
                    );
    }
    else return array(0, 0, 0);
}

?>

Я вызываю скрипт с файла.РНР?text=тестовый скрипт и цвет=000000

теперь я хотел бы знать, как я могу генерировать текст с нормальными и жирными шрифтами, смешанными в одном изображении, что-то вроде file.php?text=testing <b>script</b>&color=000000


благодаря dqhendricks, что помогли мне понять это.

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

<?php
header('Content-type: image/png');

$color = RgbfromHex($_GET['color']);

$im = imagecreatetruecolor(400, 30);

$white = imagecolorallocate($im, 255, 255, 255);

imagefilledrectangle($im, 0, 0, 399, 29, $white);

$tmp = $_GET['text'];

$words = explode(" ", $tmp);

$x = array(0,0,10); // DUMMY ARRAY WITH X POSITION FOR FIRST WORD

$addSpace = 0;

foreach($words as $word)
{
    if($addSpace) $word = " ".$word; // IF WORD IS NOT THE FIRST ONE, THEN ADD SPACE

    if(stristr($word, "<b>"))
    {
        $font = 'arialbd.ttf'; // BOLD FONT
        $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, str_replace(array("<b>","</b>"), "", $word));
    }
    else
    {
        $font = 'arial.ttf'; // NORMAL FONT
        $x = imagettftext($im, 20, 0, $x[2], 20, imagecolorallocate($im, $color[0], $color[1], $color[2]), $font, $word);
    }

    $addSpace = 1;
}

imagepng($im);

imagedestroy($im);

function RgbfromHex($hexValue) {
    if(strlen(trim($hexValue))==6) {
        return array(
                     hexdec(substr($hexValue,0,2)), // R
                     hexdec(substr($hexValue,2,2)), // G
                     hexdec(substr($hexValue,4,2))  // B
                    );
    }
    else return array(0, 0, 0);
}

?>

Примечание: это будет работать только для "жирным шрифтом" отдельных слов, разделенных пробелами, а не для жирным шрифтом части слова.

вызовите скрипт с помощью file.php?text=testing+<b>script</b>&color=000000

2 ответов


вам нужно будет загрузить файл шрифта arial-bold и выполнить два отдельных вызова imagettftext (), по одному с каждым шрифтом, который вы хотите использовать. что касается разбора строки, чтобы узнать, какие части вы хотели бы быть полужирными, и где вы должны печатать каждый раздел текста, это звучит так, как будто это станет очень сложным кодом. зачем ты вообще это используешь? возможно, есть лучшие решения для достижения того же самого.

дополнение

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

из документации:

возвращает массив с 8 элементами, представляющими четыре точки, образующие ограничивающую рамку текста. Порядок точек-нижний левый, нижний правый, верхний правый, верхний левый. Точки относительно текста независимо от угла, поэтому "верхний левый" означает в верхнем левом углу, когда вы видите текст по горизонтали. Возвращает FALSE при ошибке.


ответ:

разбор не будет проблемой, то, что у меня нет ясно, как я найду позицию X для второго wordr в Примере ?текст=тестирование скрипт. Я имею в виду, как я знаю, где заканчивается первое слово, чтобы я мог поместить второе там с другим imagettftext() и жирным шрифтом. - Мередит 9 '11 января в 2: 43


забавно, как кто-то нашел время, чтобы сказать "см правки для ответа на это", когда они могли просто сказать взорвите строку в пробелах, затем каждое слово находится в массиве..

<?PHP
$sentence = "I LOVE giving retarded answers that don't amount to jack!";
$sentence = explode(" ",$sentence );

for($s=0;$s<count($sentence);$s++){

#THERES YOUR INDIVIDUAL WORDS!
$word = $sentence[$s];

}
?>

ваша позиция X будет просто $s для вашей логики. Чтобы получить второе слово, вы можете сделать это:

<?PHP
$word1 = $sentence[0];
$word2 = $sentence[1];
$word3 = $sentence[2];
$word4 = $sentence[3];
?>

Да, я назвал $words только для умственного визуального эффекта.

$предложение[1] будет словом 2