Нарисуйте цвет для фона текста PHP и GD - PullRequest
1 голос
/ 15 июня 2011

У меня возникла другая проблема с GD и PHP.

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

Myдве идеи, в порядке предпочтения:

  1. Заполните фон цветом, как он пишет текст
  2. Запишите текст в изображение соответствующего размера со сплошным фоном, а затемналожение изображения на цель

Я не могу понять, как это сделать # 1 и # 2 кажется слишком сложным и Я не знаю, как определить размерытекст, чтобы я мог создать новое изображение для него.

Для ясности, вот вывод, который не очень хорош:

bad

А воткак бы я хотел, чтобы с тугой коробкой затекст любого цвета:

better

Я открыт для любых предложений, но рисование цвета на лету без каких-либо других изображений или хакерства, очевидно, было бы моим первым выбором.

Обновление:

После того, как @Dan предложил использовать `imagettftext ', я решил, что пришло время добавить поддержку этой функции в мою библиотеку.Все работает, как и следовало ожидать, за исключением одной серьезной проблемы.

Текст, написанный на изображении, остается прозрачным, даже если он записан на сплошном фоне (0 прозрачностей).

Вотскрипт, который я написал для тестирования:

<?php
    set_include_path('backbone:global:jquery');

    require_once('Image.php');

    $scout = new Image();
    $scout->source = "scout.jpg";

    $result = $scout->Write->Font(25, 25, "A Fairly Long String", 12, "#FF0000", 0, "LiberationSans-Regular.ttf", 1, "#FFFF00", .4, 4);

    if( !isset($_GET['dev']) )
    {
        header("Content-Type: " . $scout->contentType());
    }

    if( $result )
    {
        $scout->output();
    }
?>

Файлы, которые я использовал / требовал:
1. разведчик
2. шрифт освобождения
3. Библиотека манипулирования изображениями
- Изображение
- База изображений
- ImageCombine
- ImageDraw
- ImageManipulate
- ImageWrite

Я прошу прощения за все файлы, он действительно использует только Image, ImageBase, ImageCombineImageWrite, но остальные require_once редактируются загрузчиком.

Вот пример вывода из приведенного выше сценария:

transparent text background

ИВот вывод с нулевой прозрачностью (полностью непрозрачный):

$result = $scout->Write->Font(25, 25, "A Fairly Long String", 12, "#FF0000", 0, "LiberationSans-Regular.ttf", 1, "#FFFF00", 1, 4);

transparent on solid background

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

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

В отчаянном поиске ответа на эту проблему я наткнулся на этот ТАК вопрос , который косвенно связан с моей проблемой и содержит ответ.

Я никогда полностью не понимал, почему вы говорите imagealphablending false, когда вам нужна прозрачность, поэтому я полагаю, что моя неспособность правильно понять код, который я использую, привела к этой проблеме.

В любом случае, следующий измененный код работает как брелок в моем единственном тестовом примере. Чтобы написать текст на фоне без принудительной 100% -ной прозрачности для полей символов, необходимо включить альфа-смешение ON при написании текста:

imagealphablending($text->handle, true);
$bool = imagettftext($text->handle, $textSize, $angle, $padding, abs($size[5]) + $padding, $this->AllocateColor($rgba[0]['r'], $rgba[0]['g'], $rgba[0]['b'], $rgba[0]['alpha']), $font, $string);
imagealphablending($text->handle, false);
1 голос
/ 15 июня 2011

Может быть, это поможет вам, если вы переключитесь на ttf.http://php.net/manual/en/function.imagettfbbox.php

...