Нарисуйте текст с GD с прозрачным фоном - PullRequest
1 голос
/ 31 марта 2012

У меня есть этот код, чтобы написать текст на новом созданном изображении:

class ImageCreator
{
    public function Draw($string)
    {
        $font = "lg.ttf";

        $txtsize = imagettfbbox(20, 0, $font, $string);
        $image = imagecreatetruecolor($txtsize[2], $txtsize[4]);
        imagealphablending($image, false);
        $c = imagecolorallocatealpha($image,0,0,0,127);
        imagefilledrectangle($image,0,0,$txtsize[2],$txtsize[4], $c);
        imagealphablending($image, true);

        $c = ImageCreator::hexcol2dec("#FFFFFF");
        $white = imagecolorallocate($image, $c[0], $c[1], $c[2]);
        $c = ImageCreator::hexcol2dec("#000000");
        $black = imagecolorallocate($image, $c[0], $c[1], $c[2]);

        $c = ImageCreator::hexcol2dec("#044D8F");
        $tcolor = imagecolorallocate($image, $c[0], $c[1], $c[2]);

        imagettftext($image, 20, 0, 0, 0, $black, $font, $string);
        imagettftext($image, 20, 0, 1, 0, $tcolor, $font, $string);
        imagettftext($image, 20, 0, 2, 0, $white, $font, $string);

        imagealphablending($image,false);
        imagesavealpha($image,true);
        ob_start();
        imagepng($image);
        $imgData = ob_get_contents();
        ob_end_clean();
        return $imgData;
    }

    public function hexcol2dec($hexColor)
    {
        $R=0;
        $G=0;
        $B=0;

        for($i = 0; $i < strlen($hexColor);$i++)
        {
            if($hexColor[$i] == "#")
            {

            }
            else if($hexColor[$i] == 'A' || $hexColor[$i] == 'a')
            {
                $dec[$i] = 10;
            }
            else if($hexColor[$i] == 'B' || $hexColor[$i] == 'b')
            {
                $dec[$i] = 11;
            }
            else if($hexColor[$i] == 'C' || $hexColor[$i] == 'c')
            {
                $dec[$i] = 12;
            }
            else if($hexColor[$i] == 'D' || $hexColor[$i] == 'd')
            {
                $dec[$i] = 13;
            }
            else if($hexColor[$i] == 'E' || $hexColor[$i] == 'e')
            {
                $dec[$i] = 14;
            }
            else if($hexColor[$i] == 'F' || $hexColor[$i] == 'f')
            {
                $dec[$i] = 15;
            }
            else
            {
                $dec[$i] = $hexColor[$i];
            }
        }
        if($hexColor[0] == "#")
        {
            $R = 16*$dec[1]+$dec[2];
            $G = 16*$dec[3]+$dec[4];
            $B = 16*$dec[5]+$dec[6];
        }
        else
        {
            $R = 16*$dec[0]+$dec[1];
            $G = 16*$dec[2]+$dec[3];
            $B = 16*$dec[4]+$dec[5];
        }
        return array ($R, $G, $B);
    }


}

, и я получаю только прозрачный фон.Я новичок в PHP GD, и я не могу понять, почему не пишу текст.Пожалуйста, помогите мне разобраться

Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 марта 2012

Координаты, возвращаемые imagettfbbox, относятся к базовой точке и, как таковые, могут быть отрицательными.

Так что , когда угол равен 0 , верхний Y и левый X равныотрицательный, и вам нужно вычесть их из нижнего Y и правого X, чтобы получить размер поля.

$width = $txtsize[2] - $txtsize[0];
$height = $txtsize[1] - $txtsize[5]; 
$image = imagecreatetruecolor($width, $height);

И затем вы должны использовать абсолютные значения отрицательных координат в качестве координаты базовой точки для рисованиятекст:

imagettftext($image, 20, 0, -$txtsize[0], -$txtsize[5], $black, $font, $string);
0 голосов
/ 31 марта 2012

У вас включены предупреждения?Может быть проблема с поиском PHP файла шрифта, так как я заметил, что это не полный путь.

На вашем сервере установлена ​​библиотека FreeType?Используйте phpinfo() для подтверждения.http://www.freetype.org/

Вы можете использовать эту песочницу для проверки правильности ваших координат: http://ruquay.com/sandbox/imagettf/.

Помните, что базовой точкой являются координаты x, y, которые вы используете для рисования текста с помощьюimagettftext.Полезно взять строку типа ...

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789

и использовать значение "вышеуказанная точка" для высоты вашего шрифта.Теперь вы можете рисовать линии и использовать «высоту шрифта * начального» в качестве расстояния между строками текста, где начальным является число, например 1,45 (для 45% ведущего).

Посмотрите в комментариях нанижняя часть записи PHP Manual для этой функции для многих полезных функций: http://php.net/manual/en/function.imagettfbbox.php

...