Использование PHP GD для создания текста формы изображения с различными шрифтами - PullRequest
6 голосов
/ 09 января 2011

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

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

?>

Я вызываю скрипт с помощью file.php? Text = скрипт тестирования & color = 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 ]

0 голосов
/ 25 марта 2013

Ответ для:

С парсингом не будет проблем, у меня нет ясности в том, как найти позицию X для второго слова в примере? Text = testing script . Я имею в виду, как узнать, где заканчивается первое слово, чтобы я мог поместить второе там с другим 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

0 голосов
/ 09 января 2011

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

Добавление

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

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

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

...