type open not imagettfbbox imagestring imagen imagecolorallocate from font create crear could php unicode gd imagettftext

open - php gd create image from text



php imagettftext y emoji específicos (1)

Me he encontrado con un problema al dibujar emojis que están bajo el bloque Unicode ''Mis símbolos y pictografías''.

Aquí hay un código de ejemplo:

<?php header(''Content-Type: image/png''); $im = imagecreatetruecolor(290, 60); $grey = imagecolorallocate($im, 200, 200, 200); $black = imagecolorallocate($im, 0, 0, 0); imagefilledrectangle($im, 0, 0, 289, 59, $grey); $font = ''seguisym.ttf''; $font = realpath($font); //&#127744; is the unicode html entity for a cyclone. It is under ''Miscellaneous Symbols And Pictographs''. $text = "&#127744; is a cyclone!"; imagettftext($im, 20, 0, 5, 22, $black, $font, $text); //&#9924; is the unicode html entity for a snowman. It is under ''Miscellaneous Symbols''. $text = "&#9924; is a snowman!"; imagettftext($im, 20, 0, 5, 52, $black, $font, $text); imagepng($im); imagedestroy($im); ?>

Aquí está el resultado:

Esto es lo que debería ser:

Como puede ver, estos emoji están bajo diferentes bloques Unicode. El ciclón se encuentra en ''Símbolos y pictografías misceláneos'' y la entidad HTML se dibuja en lugar del personaje real, pero el muñeco de nieve se encuentra en ''Símbolos misceláneos'' y se dibuja correctamente. He verificado dos veces para asegurarme de que la fuente que estoy usando contiene ambos caracteres.

Para ser claro, quiero que se dibuje el personaje real y no la entidad HTML.

Los mismos caracteres representados como UTF8:


Me encontré con este mismo tipo de problema con el Abigail TTF. Después de algunas investigaciones encontré ESTE ENLACE

https://bugs.php.net/bug.php?id=17955

Que tenía este script de ejemplo en él:

<?php $str = "this is a test"; $str = iconv("UCS-2", "UTF-8", preg_replace("/(.)/","/xf0/$1", $str)); $fsize = 32; $ffile= "C:/wamp/www/gm/fonts/Aztec/101_Aztec SymbolZ.ttf"; $size = ImageTTFBBox($fsize, 0, $ffile, $str); $txt_width = ($size[2] - $size[0]); $txt_height = ($size[1] - $size[7]); $im_width = $txt_width * 1.5; $im_height = $txt_height * 1.5; $im = ImageCreateTrueColor($im_width, $im_height); $black = ImageColorAllocate($im, 0, 0, 0); $white = ImageColorAllocate($im, 255, 255, 255); $txt_x = ($im_width - $txt_width) / 2; $txt_y = ($im_height - $txt_height) / 2 + $txt_height; ImageFilledRectangle($im, 0, 0, $im_width, $im_height, $white); imagecolortransparent( $im, $white ); ImageTTFText($im, $fsize, 0, $txt_x, $txt_y, $black, $ffile, $str); Imagegif($im, "./test.gif"); ImageDestroy($im); ?>

Su respuesta: Debes convertir tu cadena a Unicdoe correctamente. Esto hizo que la fuente Abigail apareciera correctamente. Desafortunadamente, todavía estoy buscando cómo hacer que un archivo TTF no estándar se muestre correctamente. Pero creo que solo se trata de encontrar dónde colocan las fuentes reales (como su imagen de ciclón).

El otro factor frustrante es que GD colocará casillas algunas veces y algunas veces dejará el personaje en blanco. Realmente preferiría que el personaje en blanco siempre se otorgue, ya que aparece como WIDTH = 0 y HEIGHT = 0, mientras que el cuadrado puede volver con muchos tamaños diferentes. Si GD estandarizó siempre devolver un carácter en blanco sin tamaño, entonces todo lo que tiene que hacer es buscar eso. De lo contrario, tienes que saltar por los aros para descubrir que se devolvió un cuadrado.

¡Espero que esto ayude! :-)