AHL & Louïa
-
- Admin
- Messages : 15246
- Inscription : jeu. 20 oct. 2005 - 19:19
- Localisation : Maybe behind you...
- Contact :
Non.AHL 67 a écrit :Le seul "petit" problème, c'est que je n'ai pas trouvé le moyen faire lisser le texte par PHP quand il est trop petit. La solution que j'ai trouvée est donc de faire une grande image et de laisser le script du forum la redimensionner. C'est pas très élégant, ça déforme un peu la page le temps de charger l'image, mais ça marche.
Enlève cette signature dans les plus brefs délais, ou c'est moi qui te l'enlève. Ou restes-en au bon vieux texte.
EDIT: Je veux bien tenter de t'aider pour ton script. Commence par me virer l'image en attendant, et c/c le texte de ton code ici.
EDIT2: La fonction imagecreate(x,y) devrait te permettre de faire une image de taille réglementaire, non ?
- AHL 67
- Correcteur PN
- Messages : 3727
- Inscription : lun. 17 avr. 2006 - 01:09
- Localisation : Sur l'onglet d'à côté ^_^
J'ai remis la version réduite. De l'image quand même, mais réduite. Si elle change pas, c'est un problème de cache.
Le code, c'est ça :
Comme tu vois j'ai déjà prévu de la faire petite, mais en passant quand même par une grande avant vu que générer le texte en petit ça fait aucun lissage.
Pour ce qui est de l'ajout du texte, c'est surtout compliqué (à suivre) parce que je jongle avec les mises en forme et que je récupère dynamiquement le décalage provoqué.
Le code, c'est ça :
Code : Tout sélectionner
<?php
header('Content-Type: image/png');
// Récupération du décalage en fonction du texte et de la police :
function GetShift($font, $text)
{
$shift = imagettfbbox(100, 0, $font, $text);
return $shift[2];
}
// Images :
$fullW = 5000; $fullH = 500;
$resizedW = $fullW/10; $resizedH = $fullH/10;
$imgFull = imagecreatetruecolor($fullW, $fullH);
$imgResized = imagecreatetruecolor($resizedW, $resizedH);
// Couleurs :
$white = imagecolorallocate($imgFull, 255, 255, 255);
$black = imagecolorallocate($imgFull, 0, 0, 0);
// Polices :
$font = getenv('windir').'/Fonts/Verdana.ttf';
$fontB = getenv('windir').'/Fonts/VerdanaB.ttf';
$fontI = getenv('windir').'/Fonts/VerdanaI.ttf';
$fontBI = getenv('windir').'/Fonts/VerdanaZ.ttf';
// Score :
$score = [SECRET INDUSTRIEL, NON MAIS !!!];
// Remplissage des images :
imagefill($imgFull, 0, 0, $white);
imagefill($imgResized, 0, 0, $white);
imagecolortransparent($imgFull, $white);
imagecolortransparent($imgResized, $white);
// Ligne 1 :
imagettftext($imgFull, 100, 0, 30, 160, $black, $fontBI, 'AHL');
$shift = GetShift($fontBI, 'AHL');
imagettftext($imgFull, 100, 0, 30 + $shift, 160, $black, $fontB, ' contre');
$shift += GetShift($fontB, ' contre ');
imagettftext($imgFull, 100, 0, 30 + $shift, 160, $black, $fontBI, 'Le Monde');
// Ligne 2 :
imagettftext($imgFull, 100, 0, 30, 320, $black, $font, 'Score selon');
$shift = GetShift($font, 'Score selon ');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontI, 'Le Monde');
$shift += GetShift($fontI, 'Le Monde');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $font, ' :');
$shift += GetShift($font, ' : ');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontI, 'AHL');
$shift += GetShift($fontI, 'AHL');
$shift += GetShift($font, ' ');
$shift += GetShift($fontB, $score);
$shift -= GetShift($fontB, '0');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontB, '0');
$shift += GetShift($fontB, '0');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontB, ' -');
$shift += GetShift($fontB, ' - ');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontB, $score);
$shift += GetShift($fontB, $score);
$shift += GetShift($font, ' ');
imagettftext($imgFull, 100, 0, 30 + $shift, 320, $black, $fontI, 'Le Monde');
// Ligne 2 :
imagettftext($imgFull, 100, 0, 30, 480, $black, $font, 'Score selon');
$shift = GetShift($font, 'Score selon ');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontI, 'AHL');
$shift += GetShift($fontI, 'AHL');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $font, ' :');
$shift -= GetShift($fontI, 'AHL');
$shift += GetShift($fontI, 'Le Monde');
$shift += GetShift($font, ' : ');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontI, 'AHL');
$shift += GetShift($fontI, 'AHL');
$shift += GetShift($font, ' ');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontB, $score);
$shift += GetShift($fontB, $score);
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontB, ' -');
$shift += GetShift($fontB, ' - ');
$shift += GetShift($fontB, $score);
$shift -= GetShift($fontB, '0');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontB, '0');
$shift += GetShift($fontB, '0');
$shift += GetShift($font, ' ');
imagettftext($imgFull, 100, 0, 30 + $shift, 480, $black, $fontI, 'Le Monde');
// Finalisation :
imagefilter($imgFull, IMG_FILTER_SMOOTH, 10);
imagecopyresized($imgResized, $imgFull, 0, 0, 0, 0, $resizedW, $resizedH, $fullW, $fullH);
imagepng($imgResized, null, 9);
?>
Pour ce qui est de l'ajout du texte, c'est surtout compliqué (à suivre) parce que je jongle avec les mises en forme et que je récupère dynamiquement le décalage provoqué.
-
- Admin
- Messages : 15246
- Inscription : jeu. 20 oct. 2005 - 19:19
- Localisation : Maybe behind you...
- Contact :
De manière rudimentaire, tu peux afficher un truc en te faisant 'achement moins chier:
C'est un code simple, facile à améliorer, mais en l'espèce il t'affiche ton image avec pas du texte dégueux tout baveux.
Code : Tout sélectionner
<?php
// Header + taille du fichier, voilà voilà
header ("Content-type: image/png");
$image = imagecreate(500,50);
// Là tu met ton super script pour ton score de la mort qui tue
$score = 1;
// Les ptites couleurs
$blanc = imagecolorallocate($image, 255, 255, 255);
$noir = imagecolorallocate($image, 0, 0, 0);
// Le texte.
imagestring($image, 5, 0, 0, "AHL contre le Monde", $noir);
imagestring($image, 4, 0, 20, "Score selon", $noir);
imagestring($image, 5, 95, 20, "AHL :", $noir);
imagestring($image, 4, 200, 20, "AHL", $noir);
imagestring($image, 5, 250, 20, ''. $score .'', $noir);
imagestring($image, 4, 300, 20, "-", $noir);
imagestring($image, 5, 350, 20, "0", $noir);
imagestring($image, 4, 400, 20, "Le Monde", $noir);
imagestring($image, 4, 0, 35, "Score selon", $noir);
imagestring($image, 5, 95, 35, "Le Monde :", $noir);
imagestring($image, 4, 200, 35, "AHL", $noir);
imagestring($image, 5, 250, 35, "0", $noir);
imagestring($image, 4, 300, 35, "-", $noir);
imagestring($image, 5, 350, 35, ''. $score .'', $noir);
imagestring($image, 4, 400, 35, "Le Monde", $noir);
// On transforme le blanc en transparent
imagecolortransparent($image, $blanc);
// Et on affiche l'image.
imagepng($image);
?>
- AHL 67
- Correcteur PN
- Messages : 3727
- Inscription : lun. 17 avr. 2006 - 01:09
- Localisation : Sur l'onglet d'à côté ^_^
Ouais je sais mais du coup il manque la mise en forme... 
Et puis la simplicité, moi, j'aime pas.
L'autre solution serait de balancer uniquement une image pour le score, tout en gardant le reste sous forme de texte, mais là je perds l'avantage que me procurait la gestion du décalage qui faisait bien joli...
Nan moi là ce que je cherche vraiment c'est à lisser le texte quand il est trop petit, comme le fait un navigateur.
Au fait, c'était quoi le problème de la grande image ? Trop longue à charger ?
[Edit]
Au fait, le texte il est moins baveux en passant par une grande image que je réduis, même via GD, que si je le faisais direct petit...

Et puis la simplicité, moi, j'aime pas.

L'autre solution serait de balancer uniquement une image pour le score, tout en gardant le reste sous forme de texte, mais là je perds l'avantage que me procurait la gestion du décalage qui faisait bien joli...
Nan moi là ce que je cherche vraiment c'est à lisser le texte quand il est trop petit, comme le fait un navigateur.
Au fait, c'était quoi le problème de la grande image ? Trop longue à charger ?
[Edit]
Au fait, le texte il est moins baveux en passant par une grande image que je réduis, même via GD, que si je le faisais direct petit...
- AHL 67
- Correcteur PN
- Messages : 3727
- Inscription : lun. 17 avr. 2006 - 01:09
- Localisation : Sur l'onglet d'à côté ^_^
@Feather :
C'est rapport à mes interventions sur le forum, plus que plébiscitées.
@Quizzman :
Comme dit, si la grande était baveuse après passage au script, c'est la faute à FF/Opéra qui sont nuls en redimensionnement.
Bon, je vais voir si ça peut donner quelque chose d'intéressant avec imagestring, mais d'après ce que j'en ai vu quand j'avais testé, ça m'étonnerait...
C'est rapport à mes interventions sur le forum, plus que plébiscitées.

@Quizzman :
Comme dit, si la grande était baveuse après passage au script, c'est la faute à FF/Opéra qui sont nuls en redimensionnement.
Bon, je vais voir si ça peut donner quelque chose d'intéressant avec imagestring, mais d'après ce que j'en ai vu quand j'avais testé, ça m'étonnerait...
- Gontrand00
- Silver Mario
- Messages : 5162
- Inscription : sam. 28 juin 2008 - 13:31
- AHL 67
- Correcteur PN
- Messages : 3727
- Inscription : lun. 17 avr. 2006 - 01:09
- Localisation : Sur l'onglet d'à côté ^_^
Les inverser ?!? 
Toujours est-il que c'est fait, la version imagestring est opérationnelle. Même que ça ressemble à peu près à quelque chose, mais pour ça j'ai dû me faire chier : je me suis fait mes propres polices...
Et faire une police, mine de rien, même à partir de copies d'écran du texte, ça prend son temps. Et encore, là j'ai fait du Courier New, une police à largeur fixe, où certains caractères ont tout de même des morceaux qui dépassent quand ils sont en gras et/ou italique... Je comptais me faire le Verdana du forum dans la foulée, mais vu que c'est un police à largeur variable, pour ajuster chaque caractère, j'ai pas fini...
Bref, le code est donc devenu ça :Je garde mon calcul du décalage en dynamique pour pas être coincé si je veux changer un peu le texte. J'ai quand même réussi à vachement le simplifier. 

Toujours est-il que c'est fait, la version imagestring est opérationnelle. Même que ça ressemble à peu près à quelque chose, mais pour ça j'ai dû me faire chier : je me suis fait mes propres polices...

Et faire une police, mine de rien, même à partir de copies d'écran du texte, ça prend son temps. Et encore, là j'ai fait du Courier New, une police à largeur fixe, où certains caractères ont tout de même des morceaux qui dépassent quand ils sont en gras et/ou italique... Je comptais me faire le Verdana du forum dans la foulée, mais vu que c'est un police à largeur variable, pour ajuster chaque caractère, j'ai pas fini...

Bref, le code est donc devenu ça :
Code : Tout sélectionner
<?php
header('Content-Type: image/png');
// Ajout de chaque char séparément pour les coller un peu :
function PutText($font, $x, $y, $text)
{
for ($i = 0; isset($text[$i]); $i++)
imagestring($GLOBALS['img'], $font, $x + $i*$GLOBALS['charW'], $y, $text[$i], $GLOBALS['black']);
return $i;
}
// Score :
$score = [Z'AVEZ TOUJOURS PAS DEVINÉ !];
// Polices :
$font = imageloadfont('../CMS/data/fonts/CourierNew10.font');
$fontB = imageloadfont('../CMS/data/fonts/CourierNew10B.font');
$fontI = imageloadfont('../CMS/data/fonts/CourierNew10I.font');
$fontBI = imageloadfont('../CMS/data/fonts/CourierNew10BI.font');
$charW = 8; // En réalité ils font 9, mais à 8 c'est plus joli
$charH = 17;
// Image :
$imgW = $charW*strlen('Score selon Le Monde : AHL '.$score.' - '.$score.' Le Monde') + 6;
$imgH = $charH*3 + 12;
$img = imagecreatetruecolor($imgW, $imgH);
// Couleurs :
$white = imagecolorallocate($img, 255, 255, 255);
$black = imagecolorallocate($img, 0, 0, 0);
// Remplissage de l'image :
imagefill($img, 0, 0, $white);
imagecolortransparent($img, $white);
// Ligne 1 :
$shift = PutText($fontBI, 3, 3, 'AHL');
$shift += PutText($fontB, 3 + $charW*$shift, 3, ' contre ');
$shift += PutText($fontBI, 3 + $charW*$shift, 3, 'Le Monde');
// Ligne 2 :
$shift = PutText($font, 3, $charH + 6, 'Score selon ');
$shift += PutText($fontI, 3 + $charW*$shift, $charH + 6, 'Le Monde');
$shift += PutText($font, 3 + $charW*$shift, $charH + 6, ' : ');
$shift += PutText($fontI, 3 + $charW*$shift, $charH + 6, 'AHL ');
$shift += strlen($score) - strlen('0');
$shift += PutText($fontB, 3 + $charW*$shift, $charH + 6, '0 - '.$score);
$shift += PutText($fontI, 3 + $charW*$shift, $charH + 6, ' Le Monde');
// Ligne 3 :
$shift = PutText($font, 3, 2*$charH + 9, 'Score selon ');
$shift += PutText($fontI, 3 + $charW*$shift, 2*$charH + 9,'AHL');
$shift += PutText($font, 3 + $charW*$shift, 2*$charH + 9,' : ');
$shift += strlen('Le Monde') - strlen('AHL');
$shift += PutText($fontI, 3 + $charW*$shift, 2*$charH + 9,'AHL');
$shift += PutText($fontB, 3 + $charW*$shift, 2*$charH + 9, ' '.$score.' - ');
$shift += strlen($score) - strlen('0');
$shift += PutText($fontB, 3 + $charW*$shift, 2*$charH + 9, '0 ');
$shift += PutText($fontI, 3 + $charW*$shift, 2*$charH + 9, 'Le Monde');
// Sortie :
imagepng($img, null, 9);
?>

- Gontrand00
- Silver Mario
- Messages : 5162
- Inscription : sam. 28 juin 2008 - 13:31