HTML Dans GD

Mammouth du PHP | 687 Messages

17 déc. 2015, 00:04

Bonjour à tous,

Je n'arrive pas à afficher mes caractères html malgrès mes fonctions.
pouvez-vous me dire ce qui cloche svp?

Merci :-)
<?php
require('gif.class.php');
$animation = array();
$duree = array();
  
//define('LARGEUR', 600);
//define('HAUTEUR', 600);
/* * *******************************  * Parametre  * ********************************  */ 
$largeur = 600; /* longueur de l'image */ 
$hauteur = 600; /* hauteur de l'image */ 

// Le texte à afficher
$ok = 'Test<br /> </p> dfdgdf hh fhfhgh hfhgfhgfhfghgfh hfghgfjfgfgh hfhfghgfhgfhfg moi'; 

//conversion des Balises HTML
function convertir_en_caracteres_html($texte)
{
   return str_replace(
	array("<",">","&","'",""","&nbsp;","&rsquo;","&#61623;","&euro;"), 
	array("<",">","&","'","\""," ","'","-","euro"), htmlspecialchars_decode($texte, ENT_NOQUOTES));
}
//épuration du texte de tout codage
function epurer_texte($texte) {
	$texte =  html_entity_decode(convertir_en_caracteres_html($texte));
	$texte =  preg_replace("#(</p>)|(<br\s*/*>)#ism", "\n", $texte);
	$texte =  preg_replace("#(<[^>]*>)#ism", "", $texte);
	$texte =  preg_replace("#(?:\r\n|\r|\n|\t){2,}#ism", "\n", $texte);
    return trim($texte);
}
//pour couper un texte au milieu
function getMilieuTexte($texte){
	$milieu = strlen($texte)/2;
	//eviter de couper un mot
	for ($i=$milieu; $i<strlen($texte); $i++){ if (substr($texte,$i,1)=="." || substr($texte,$i,1)=="\n") break; }
	return ($i<strlen($texte)?$i+1:$milieu);
}
$txt = epurer_texte($ok);
/* * *******************************  * IMAGE 1  * ********************************  */ 
$image = imagecreate($largeur, $hauteur); 
/* Background */ 
$background = imagecolorallocate($image, 0, 255, 0);
$image= imagecreatefrompng('2016/1.png'); //Notre joli fond :p 
/* Couleur du text */ 
$couleurTxt = imagecolorallocate($image, 238, 153, 26); 
/* texte à mettre dans l'image */ 

/* Taille du texte */ 
$font_size = 10; 
$font = 'arial.ttf';
/* Hauteur et largeur des caratères */ 
$largeurCaractere = ImageFontWidth($font_size); 
$hauteurCaractere = ImageFontHeight($font_size); 
/* Longueur du texte (taille caratère X nombre de caractère) */ 
$largeurTxt = $largeurCaractere * strlen($txt); 
/* Recherche de la position horizontale centrale pour centrer le texte */ 
$positionCentreHor = ceil(($largeur - $largeurTxt) / 2); 
/* Recherche de la position horizontale centrale pour centrer le texte */ 
//$positionCentreVer = ceil(($hauteur - $hauteurCaractere) / 2); 
$positionCentreVer = 420; 
/* Ajout du texte au centre de l'image */ 
imagestring($image,  $font_size, $positionCentreHor, $positionCentreVer, $txt, $couleurTxt);

ob_start();
imagegif($image);
$animation[] = ob_get_clean();
$duree[] = 20;
imagedestroy($image);

/* * *******************************  * CREATION IMAGE  * ********************************  */   
$gif = new GIFEncoder($animation, $duree, 0, 2, 0, 0, 0, 'bin');
header ("Content-type: image/gif");
echo $gif->GetAnimation();
?>
Par exemple <br /> </p> se transforment en vT

Il faudrait que mon texte fasse 600px X 150px max. Donc s'il dépasse 600px alors une nouvelle ligne se créée.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

17 déc. 2015, 00:18

Bonjour,

Comme j'ai pu te le dire précédemment, GD ne gère pas les balises HTML
post440905.html#p440905

Regarde le lien que je t'ai donné dans mon 2nd message, c'est une fonction qui va justement te créer automatiquement des nouvelles lignes quand il tombe sur un \n
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 687 Messages

17 déc. 2015, 00:32

ok merci.
mais je ne sais pas et n'arrive pas à l'appliquer...

Comment faire?
merci.

Mammouth du PHP | 687 Messages

17 déc. 2015, 01:26

j'ai testé ça :
for($i = 0, $exploded_contents = explode("<br />", $txt), $count = count($exploded_contents); $i < $count; $i++) {
imagestring($image, $font_size, $positionCentreHor, $positionCentreVer + 15 * $i, str_replace("\t", "    ", $exploded_contents[$i]), $couleurTxt);
}
ça fonctionne, le problème c'est que si le texte est trop long il est mangé :-( de plus le texte n'est pas centré...
Il faut donc utiliser je pense :
function whitespaces_imagestring($image, $font, $x, $y, $string, $color) {
    $font_height = imagefontheight($font);
    $font_width = imagefontwidth($font);
    $image_height = imagesy($image);
    $image_width = imagesx($image);
    $max_characters = (int) ($image_width - $x) / $font_width ;
    $next_offset_y = $y;
 
    for($i = 0, $exploded_string = explode("\n", $string), $i_count = count($exploded_string); $i < $i_count; $i++) {
        $exploded_wrapped_string = explode("\n", wordwrap(str_replace("\t", "    ", $exploded_string[$i]), $max_characters, "\n"));
        $j_count = count($exploded_wrapped_string);
        for($j = 0; $j < $j_count; $j++) {
            imagestring($image, $font, $x, $next_offset_y, $exploded_wrapped_string[$j], $color);
            $next_offset_y += $font_height;
 
            if($next_offset_y >= $image_height - $y) {
                return;
            }
        }
    }
}
Mais je ne sais pas l'adapter...

Mammouth du PHP | 687 Messages

17 déc. 2015, 23:15

Ok j'ai trouvé !
en fait il suffisait de copier la fonction et de l'appeler :
whitespaces_imagestring($image, $font_size, 10, 420, $txt, $couleurTxt);
Par contre, savez-vous comment positionner le texte à 420px du TOP (car lorsque je mets 420 seule la première ligne s'affiche) et centrer le bloc texte horizontalement.
Et interpréter les caractères de type oe ou è etc...

Merci;

Mammouth du PHP | 687 Messages

18 déc. 2015, 18:03

Bon le texte est centré, enfin, seule la première ligne est centrée..
Pouvez-vous m'aider à centrer tout le bloc texte svp ?

Merci :-)
$text_length = 70;
$new_text = wordwrap($txt, $text_length, "<br />", true);
$text = str_replace('<br />', "\n", $new_text);

// First we create our bounding box for the first text
$bbox = imagettfbbox(10, 0, $font, $text);

// This is our cordinates for X and Y
$x = $bbox[0] + (imagesx($image) / 2) - ($bbox[4] / 2) - 25;
$y = $bbox[1] + (imagesy($image) / 2) - ($bbox[5] / 2) - 5;

// Write it
imagettftext($image, 10, 0, $x+20, 420, $couleurTxt, $font, $text);