Page 1 sur 1

HTML Dans GD

Posté : 17 déc. 2015, 00:04
par orell1
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.

Re: HTLM Dans GD

Posté : 17 déc. 2015, 00:18
par @rthur
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

Re: HTML Dans GD

Posté : 17 déc. 2015, 00:32
par orell1
ok merci.
mais je ne sais pas et n'arrive pas à l'appliquer...

Comment faire?
merci.

Re: HTML Dans GD

Posté : 17 déc. 2015, 01:26
par orell1
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...

Re: HTML Dans GD

Posté : 17 déc. 2015, 23:15
par orell1
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;

Re: HTML Dans GD

Posté : 18 déc. 2015, 18:03
par orell1
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);