par
shelko » 21 avr. 2010, 18:03
Bonjour,
J'essaie de temps de trouver une solution pour écrire plusieurs lignes centrées en largeur et hauteur sur une image via imagettftext.
J'ai essayé de découper mon texte ligne par ligne en faisant un explode et de recalculer le centrage dynamiquement.
Mais je ne sais pas comment faire pour les écrire sur l'image car celà m'inscrit que le dernier.
Voici mon code :
Code : Tout sélectionner
$idbbp=$_POST['idbbp'];
$req="SELECT * FROM bb_perso WHERE id_bbp='".$idbbp."'";
$query=mysql_query($req) or die (mysql_error());
$data=mysql_fetch_assoc($query);
$largeur=$data['largeur'];
$hauteur=$data['hauteur']-$_POST['size'];
$xtempo=$data['x_saisie']+($largeur)/2;
$ytempo=$data['y_saisie']+($hauteur)/2;
$img='../bbperso/'.$_SESSION['pseudo_user'].'/img/'.$data['nom_ctn'];
$ig='../bbperso/'.$_SESSION['pseudo_user'].'/img/'.trim($_POST['nom']).'.jpg';
$font='../font/'.trim($_POST['font']).'.ttf';
//creation taille réelle
$texte=$_POST['saisie'];
$size = floatval($_POST['size']);
$box=imagettfbbox($_POST['size'], 0, $font, $texte);
$larg=$box[2] - $box[0];
$haut=$box[1] - $box[7];
$x=$xtempo-($larg/2);
$y=$ytempo-($haut/2)+($_POST['size']*2);
if($larg<$largeur and $haut<$hauteur){
$tab=explode("\n", $_POST['saisie']);
foreach($tab as $value){
$box=imagettfbbox($_POST['size'], 0, $font, $value);
$larg=$box[2] - $box[0];
$haut=$box[1] - $box[7];
$x=$xtempo-($larg/2);
$im=imagecreatefromjpeg($img);
if(trim($_POST['color'])=='red'){$color=imagecolorallocate($im, 255, 0, 0);}
elseif(trim($_POST['color'])=='green'){$color=imagecolorallocate($im, 0, 255, 0);}
elseif(trim($_POST['color'])=='blue'){$color=imagecolorallocate($im, 0, 0, 255);}
elseif(trim($_POST['color'])=='white'){$color=imagecolorallocate($im, 255, 255, 255);}
else{$color=imagecolorallocate($im, 0, 0, 0);}
imagettftext($im, $_POST['size'], 0, $x, $y, $color, $font, $value);
imagejpeg($im, $ig, 100);
$y=$y+$haut;
}
imagedestroy($im);
}
Donc en gros mon soucis c'est qu'avec ce code s'il y a 3 ligne il m'affiche juste la dernière.
Merci d'avance pour vos réponses
Bonjour,
J'essaie de temps de trouver une solution pour écrire plusieurs lignes centrées en largeur et hauteur sur une image via imagettftext.
J'ai essayé de découper mon texte ligne par ligne en faisant un explode et de recalculer le centrage dynamiquement.
Mais je ne sais pas comment faire pour les écrire sur l'image car celà m'inscrit que le dernier.
Voici mon code :
[code]$idbbp=$_POST['idbbp'];
$req="SELECT * FROM bb_perso WHERE id_bbp='".$idbbp."'";
$query=mysql_query($req) or die (mysql_error());
$data=mysql_fetch_assoc($query);
$largeur=$data['largeur'];
$hauteur=$data['hauteur']-$_POST['size'];
$xtempo=$data['x_saisie']+($largeur)/2;
$ytempo=$data['y_saisie']+($hauteur)/2;
$img='../bbperso/'.$_SESSION['pseudo_user'].'/img/'.$data['nom_ctn'];
$ig='../bbperso/'.$_SESSION['pseudo_user'].'/img/'.trim($_POST['nom']).'.jpg';
$font='../font/'.trim($_POST['font']).'.ttf';
//creation taille réelle
$texte=$_POST['saisie'];
$size = floatval($_POST['size']);
$box=imagettfbbox($_POST['size'], 0, $font, $texte);
$larg=$box[2] - $box[0];
$haut=$box[1] - $box[7];
$x=$xtempo-($larg/2);
$y=$ytempo-($haut/2)+($_POST['size']*2);
if($larg<$largeur and $haut<$hauteur){
$tab=explode("\n", $_POST['saisie']);
foreach($tab as $value){
$box=imagettfbbox($_POST['size'], 0, $font, $value);
$larg=$box[2] - $box[0];
$haut=$box[1] - $box[7];
$x=$xtempo-($larg/2);
$im=imagecreatefromjpeg($img);
if(trim($_POST['color'])=='red'){$color=imagecolorallocate($im, 255, 0, 0);}
elseif(trim($_POST['color'])=='green'){$color=imagecolorallocate($im, 0, 255, 0);}
elseif(trim($_POST['color'])=='blue'){$color=imagecolorallocate($im, 0, 0, 255);}
elseif(trim($_POST['color'])=='white'){$color=imagecolorallocate($im, 255, 255, 255);}
else{$color=imagecolorallocate($im, 0, 0, 0);}
imagettftext($im, $_POST['size'], 0, $x, $y, $color, $font, $value);
imagejpeg($im, $ig, 100);
$y=$y+$haut;
}
imagedestroy($im);
}[/code]
Donc en gros mon soucis c'est qu'avec ce code s'il y a 3 ligne il m'affiche juste la dernière.
Merci d'avance pour vos réponses