Я хочу обрезать заданный текст на заданное количество пикселей.
Для этого я делаю цикл по длине текста и с каждым циклом добавляю следующий символ и измеряю строку с помощью метода. imagettfbbox
, — Это нормально работает для меня на «нормальном тексте», например. как эта публикация. 😉
Но если я добавлю немного смайликов в свой текст, длина будет даже меньше, чем ожидалось. Я думаю, это потому, что эмоджи кодируются более чем 1 байтом. —
Вот почему я использую mb_strwidth
а также mb_substr
,
Метод imagettfbbox
ожидает файл шрифта для измерения заданной строки. Этот шрифт может отображать мои эмодзи.
Вот мой код
$Line = " Garden, Clock, some other things";
$MaxLength = 100; // Pixel
// Start looping through the line, start with 15 characters
for ( $Len = 15; $Len < mb_strwidth($Line); $Len++ ) {
// Grep x Chars from line
$NewLine = mb_substr($Line, 0, $Len);
// Measure string
$FontBox = imagettfbbox(12, 0, "fonts/OpenSansEmoji.ttf", $NewLine);
$TextWidth = $FontBox[2];
// Compare measured string with given max length
if ( $TextWidth > $MaxLength ) {
$Line = mb_substr($Line, 0, $Len - 2) . "...";
break;
}
}
$Line = NewLine;
Строки примера
" Garden, Clock, some other things"" Gaaaaaaaaaaaardeeeeeeeeeeeeeeeeeen""mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm""iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii""erufgbwuiergbvfuipwervbpiuwebvruiwbevuibwüeriuvbwieuörvböwieuvbr"
Как видите, чем больше смайликов я использую, тем короче линия.
С уважением от не носитель языка. 🙂
Задача ещё не решена.
Других решений пока нет …