使用PHP在透明PNG上渲染窄字体

时间:2014-11-13 12:09:09

标签: php fonts gd

我试图在透明图像中正确渲染一些文本(然后我会将此生成的图像添加到另一个图像中)。问题是PHP和alpha透明度在字体很窄时很奇怪。

以下是使用的代码: (使用https://github.com/stil/gd-text库来呈现文本)

<?php

require_once (dirname(__FILE__).'/vendor/autoload.php');

class TextImage
{
    protected $text;
    protected $width;
    protected $height;
    protected $font;
    protected $colorR;
    protected $colorG;
    protected $colorB;
    protected $size;

    /**
     * 
     * @param int $width Image width
     * @param int $height Image height
     * @param string $font Font path
     */
    public function __construct($text=null, $width=null, $height=null, $font=null, $colorR=null, $colorG=null, $colorB=null, $size=null)
    {
        $this->width = $width;
        $this->height = $height;
        $this->font = $font;
        $this->colorR = $colorR;
        $this->colorG = $colorG;
        $this->colorB = $colorB;
        $this->size = $size;
        $this->text = $text;
    }

    public function render()
    {
        // create image for the given width/height
        $image = imagecreatetruecolor($this->width, $this->height);

        // apply transparence
        imagealphablending($image, false);
        imagesavealpha($image, true);
        $transparent = imagecolorallocatealpha($image, 0,0,0, 127);
        imagefill($image, 0, 0, $transparent);

        // now use GDText to add the text
        $box = new \GDText\Box($image);
        $box->setFontFace($this->font);
        $box->setFontColor([$this->colorR, $this->colorG, $this->colorB]);
        //$box->setTextShadow([0, 0, 0, 50], 2, 2);
        $box->setFontSize($this->size);
        //$box->setLeading(0.8);
        $box->setBox(0, 0, $this->width, $this->height);
        $box->setTextAlign('center', 'center');
        $box->draw($this->text);

        // output
        header("Content-type: image/png");
        imagepng($image);
    }
}

以下是测试用例:

$test = new TextImage('Exemple', 200, 30, 'Exmouth.ttf', 0, 0, 0, 20);
$test->render();

我使用的是这种字体:http://www.dafont.com/exmouth.font

这是渲染图像:

Exemple

看看文字是如何破碎的?并非总是如此。这是另一个例子,其中包含其他一些文字:

Some other text

如果我不做透明度,那么它看起来很好。也许我应该切换到另一个解决方案来呈现透明文本?

注意:如果我改变字体&amp;图片大小它没有改变任何透明度问题。

1 个答案:

答案 0 :(得分:1)

问题是由行imagealphablending($image, false);引起的。删除此选项会导致文本正确呈现。这仍然会生成一个图像,其中包含完整的alpha通道数据,因此我希望您可以将其用于后续合并。

至于为什么会发生这种情况......我不知道。我不能用另一种字体重现问题。我最好的猜测是,由于GD中的错误或者字体的设计方式存在问题,因此字体不能与GD完美搭配。