текст — Как я могу изменить цвет определенного слова, используя Imagick в PHP?

Я сейчас пользуюсь 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Но у меня нет идей.

Как мне этого добиться?

0

Решение

Как следует из комментария Данака, вот мое решение, если оно кому-нибудь нужно. Функция 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);
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector