Я использую функцию imagettftext для написания текста на изображении, но мой текст содержит смайлики и заменяет смайлики на квадратные рамки
Вот мой код:
$black = imagecolorallocate ( $main_img, 0x00, 0x00, 0x00 );
$font_path = "Arial.ttf";
imagettftext ( $main_img, 14, 0, 73, 685, $black, $font_path, $text );
Образец текста:
test testt Hello Those Mega x ❤️ Graphic
Я попытался с изменением шрифта, который является «Arial Unicode», но это не решенная проблема.
Как я могу решить эту проблему?
Заранее спасибо.
Во-первых, нам нужно понять, как реализованы смайлики:
PNG-изображения Apple (таблица SBIX)
Apple реализовала это, используя проприетарное, неопубликованное расширение спецификации TrueType / OpenType для добавления изображений PNG к шрифту. Эти изображения PNG затем отображаются в бегущем тексте. Google также реализовал аналогичную вещь, но она не совместима с решением Apple.
Mozilla и Adobe SVG (таблица SVG).
Эти два веб-гиганта собрались вместе для самого амбициозного формата: SVG в OpenType. Вместо того, чтобы сопоставлять символ Unicode с глифом, мы отображаем его в изображение SVG. Это приносит нам все прекрасные дополнительные возможности SVG, включая градиенты, встроенные растровые изображения и даже анимацию. Это уже поддерживается в Firefox начиная с версии 26!
Microsoft COLR / CPAL
По умолчанию новый шрифт Segoe UI Emoji ведет себя как обычный шрифт TrueType / OpenType. Он имеет Unicode-кодированные, неокрашенные «базовые глифы». Но в шрифте есть две дополнительные таблицы: таблица COLR связывает дополнительные глифы в виде слоев с базовыми глифами и определяет порядок этих слоев. А в таблице CPAL («Цветовая палитра») хранится одна или несколько цветовых палитр для отдельных слоев. (Различные цветовые палитры полезны для отображения шрифта на темном и светлом фоне.) Поэтому, когда есть поддержка этой новой функции цвета, базовые глифы будут заменены цветными слоями.
Изображения Google в формате PNG (таблицы CBDT / CBLC).
Google предложил реализацию, которая использует изображения PNG для глифов. Глифы просто заменяются старыми добрыми изображениями. Это отлично работает для небольших иконок и, очевидно, дает всю творческую свободу растровых изображений, но не очень хорошо масштабируется. Взорвите глиф достаточно большой, и вы столкнетесь с размытыми пикселями. Также будет трудно, если не невозможно, изменить цвет глифов с помощью CSS. Интересно, что они указывают, что в их реализации не должно быть таблицы GLYF — таблицы, которая содержит неокрашенные «нормальные» глифы — так что, похоже, не существует запасного варианта, когда этот формат не поддерживается. Это уже реализовано в FreeType, который используется в Android и Linux, но предложение OpenType принесло бы это и на компьютеры Windows и Apple.
Последний подход — это то, что нас интересует. Это потому, что imagefttext
это функция, предоставляемая расширением PHP GD. А GD внутренне использует библиотеку FreeType для рисования текста.
Emojis поддерживаются в FreeType начиная с версии 2.5. Попробуйте выполнить php -i
Команда, чтобы увидеть, какая версия FreeType у вас есть. Это мое:
Поддержка FreeType => включена FreeType Linkage => со свободным типом Версия FreeType => 2.5.2
Тем не менее, после попытки с некоторыми образцами шрифтов я нашел Вот, PHP продолжает выдавать предупреждение:
Warning: imagefttext(): Could not set character size
я боюсь, что Библиотека GD не поддерживает FT_LOAD_COLOR флаг. Этот флаг должен иметь цветные смайлики. Смотрите список изменений FreeType:
2013-05-23 Бехдад Исфахбод Добавлена поддержка цветных встроенных растровых изображений (например, цветных эмодзи). Новый флаг загрузки FT_LOAD_COLOR делает цвет загрузки FreeType встроенные растровые изображения в соответствии с этим проектом спецификации https://color-emoji.googlecode.com/git/specification/v1.html
Чтобы ответить на ваш вопрос: вы не можете использовать цветные смайлики, используя imagefttext
, Прости .
Вы также не можете рисовать черно-белые смайлики в GD. Это связано с тем, что GD поддерживает только 1-3 многобайтовых символа UTF-8. Диапазон символов Emojis принадлежит 4 байтовым символам UTF-8.
Источник: https://github.com/libgd/libgd/blob/master/src/gdft.c#L341
Таблица Emojis с многобайтовым представлением UTF-8: http://apps.timwhitlock.info/emoji/tables/unicode
Попробуйте использовать шрифт с известными символами Unicode Emoji. подобно Symbola
Можете ли вы опубликовать, какой смайлик вы пытаетесь использовать? Было бы лучше, если бы вы могли дать нам коды, которые вы можете увидеть в windows charmap после выбора смайлика.
В Arial я нашел только этих смайликов: ☺☻☼♀♂ ♠ ♣ ♥ ♦ ♪ ♫ ♯ — все они появляются без проблем. Я использовал пример с php.net
Я предлагаю Вам использовать библиотеку PHP ImageMagick. Хотя я не пробовал это с эмодзи, я столкнулся с той же проблемой, что и вы с другими символами Юникода, когда пытался рендерить текст с помощью DG.
Кстати, переход на IM — это хорошая идея, по крайней мере, из-за лучшей производительности и меньших недостатков.
Вот мое предложение:
Используйте это для создания цветных симпатичных эмодзи (выберите выход .png)
http://git.emojione.com/demos/latest/phpunicodetoimage.php#output
Используйте imagettftext и Arial.ttf для оставшегося текста
Добавить все .png используя Imagick :: appendImages