Приведение символов ttf в изображение с помощью PHP

100
12

Я бы очень признателен за помощь любого, у кого больше опыта работы с PHP, чем у меня.

Я использую PHP для создания плотноупакованных текстовых изображений. Пока это работает так:

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

Затем он помещает следующий символ так, чтобы нижний левый угол его ограничивающего блока находился в той же точке, что и нижний правый угол ограничивающей рамки символа (плюс некоторая случайность и т.д.). Код для этого выглядит следующим образом:

$coords = array();
$pos_y = $this->image_height / 2;

for ($counter = 0; $counter < $this->code_length; $counter++){
$sbox = @imagettfbbox($size, $angle, $font, $this->code[$counter]);
if($counter == 0)
$pos_x = $this->image_width / $this->code_length;
else
// element 2 is the x co-ord of the bottom right corner of the ttf box
$pos_x = $coords[$counter-1][2];
@imagettftext($this->image, $size, $angle,
$pos_x, $pos_y, $fontcolor, $font, $this->code[$counter]);
}

и повторите 4 для каждого последующего символа в строке.

Я хочу, насколько это возможно, каждого персонажа, касающегося его соседа (ов). То, что я делал до сих пор, отлично подходит для таких персонажей, как "М", где нижние углы глифа более или менее расположены в углах ограничивающего прямоугольника, но нигде не приближаются к букве "G" или "Я".

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

Любые мысли/идеи/советы очень ценятся.

спросил(а) 2013-06-21T17:54:00+04:00 7 лет, 4 месяца назад
1
Решение
59

ограничивающая рамка просто такова - поле, которое указывает значения min/max x и y для текста. Если у вас есть буква C и буква O, чтобы связать их ограничивающие прямоугольники, они не будут касаться фактических букв, потому что линия, в которую соединены две буквы, имеет верхнюю и нижнюю стороны C, а O - посередине.

Если вы хотите удостовериться, что письма касаются, вам нужно будет получить данные плана глифа, а также использовать умные алгоритмы, которые находят точки проецирования для глифа 1 на глиф 2, или используют наивный алгоритм minmax, где вы помещаете два рядом друг с другом, растеризуйте их прозрачным цветом, посмотрите, если какой-либо из цветных пикселей темнее, чем они должны быть, если это так, переместите буквы на расстояние D, повторите попытку, если они не перекрываются, вернитесь вместе на расстояние D/2, если они перекрываются, снова выйдите на D/4, если они этого не сделают, переместитесь больше на D/4, затем исправьте D/8, D/16 и т.д., пока расстояние не станет меньше пиксель.

Выравнивание коробочных коробок дешево и легко, что вы хотите сделать, к сожалению, не оба. Это может быть дешево (но тогда алгоритм трудный) или легкий (но тогда алгоритм дорог).

(если вы хотите попробовать использовать данные глифных контуров, попробуйте использовать FreeType2 или что-то вроде https://github.com/pomax/php-font-parser)

ответил(а) 2013-06-21T18:46:00+04:00 7 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема