Я сейчас пользуюсь annotateImage
добавить текст к изображению.
/* Black text */
$draw->setFillColor('black');
/* Font properties */
$draw->setFont('Bookman-DemiItalic');
$draw->setFontSize( 30 );
$image->annotateImage($draw, 10, 45, 0, 'The fox jumped over the lazy dog');
В настоящее время весь текст отображается черным цветом. Я ищу способ изменить цвет слова лиса в red
Но у меня нет идей.
Как мне этого добиться?
Как следует из комментария Данака, вот мое решение, если оно кому-нибудь нужно. Функция parseText ищет <span>
теги с атрибутами, color, font, size
и возвращает массив.
The <span color="red">fox</span> jumped over the lazy <span color="green">dog</span>.
В приведенном выше тексте слово лиса будет иметь color=red
атрибут и собака буду иметь color=green
,
Используя массив, мы можем нарисовать обычный текст, отследить расположение и нарисовать стилизованные тексты.
function parseText($txt) {
if ( strstr($txt, '<span') ) {
$txt = preg_split('@(<span(?:\\\?.)*?>(?:\\\?.)*?</span>)@', $txt, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
$arr = array();
foreach ( $txt as $t ) {
if ( strstr($t, '<span') ) {
$tag = array();
preg_match('@<span\s*((?:\\\?.)*?)\s*>((?:\\\?.)*?)</span>@', $t, $m);
$attrs = $m[1];
$inner = $m[2];
if ( $attrs ) {
$attrs = preg_split('@((?:\\\?.)*?=["\'](?:\\\?.)*?["\'])\s*@', $attrs, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
foreach ( $attrs as $a ) {
$a = explode('=', $a);
$tag[ $a[0] ] = trim($a[1], '"\'');
}
}
$tag['text'] = $inner;
$arr[] = $tag;
} else {
$arr[] = array( 'text' => $t );
}
$txt = $arr;
}
}
return $txt;
}
function newStyle($image, $draw, $t, &$width) {
if ( $t['color'] ) $draw->setFillColor($t['color']);
if ( $t['size'] ) $draw->setFontSize($t['size']);
if ( $t['font'] ) $draw->setFont($t['font']);
$metrics = $image->queryFontMetrics($draw, $t['text'], FALSE);
$width = $metrics['textWidth'];
}
// To use it
function defaultStyle($draw) {
$draw->setFillColor('black');
$draw->setFont('Bookman-DemiItalic');
$draw->setFontSize(20);
}
defaultStyle($draw);
$txt = 'The <span color="red">fox</span> jumped over the lazy <span color="green">dog</span>.';
$x = 45;
$y = 45;
$txt = parseText($txt);
if ( is_array($txt) ) {
foreach ( $txt as $t ) {
defaultStyle($draw);
newStyle($image, $draw, $t, $width);
$image->annotateImage($draw, $x, $y, 0, $t['text']);
$x += $width;
}
} else {
$image->annotateImage($draw, $x, $y, 0, $txt);
}
Других решений пока нет …