Рендеринг узкого шрифта на прозрачном PNG с помощью Stack Overflow

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

Вот код, используемый:
(с помощью 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

Видите, как текст нарушен? И это не всегда так. Вот еще один пример с другим текстом:

Какой-то другой текст

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

Примечание: если я изменю шрифт & размер изображения Это ничего не меняет с проблемой прозрачности.

1

Решение

Проблема вызвана линией imagealphablending($image, false);, Удаление этого приводит к правильному отображению текста. Это по-прежнему создает изображение с неповрежденными данными альфа-канала, поэтому я ожидаю, что вы сможете использовать его для последующего слияния.

Что касается того, почему это происходит … Я понятия не имею. Я не могу воспроизвести проблему с другим шрифтом. Мое лучшее предположение состоит в том, что шрифт почему-то не очень хорошо работает с GD, либо из-за ошибки в GD, либо из-за проблемы в том, как разработан шрифт.

1

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

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

По вопросам рекламы [email protected]