Page 1 sur 2
Redimensionner les images, si nécessaire (pour forum)
Posté : 18 juin 2006, 15:26
par Invité
Bonjour à tous !
Alors j'ai créé mon propre système de forum, utilisant du BBCode. Cependant, je suis régulièrement gêné par des images postées qui sont trop grandes. Je voudrais donc, que si les images ont une largeur supérieure à 350 pixels, l'attribut width="350" soit ajouté à la balise <img> obtenue avec le BBCode. Je ne souhaite pas que les images soient "miniaturisées" et stockées sur mon serveur (pour des questions évidentes de place et de bande passante), mais simplement qu'elles soient redimensionnées dans le forum. Comment puis je faire cela ?
Voici les passages concernés de ma fonction bbcode :
Code : Tout sélectionner
function code($chaine) {
$chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" alt="$2" />',$chaine);
$chaine = preg_replace('#\[img](.+?)\[/img]#si','<img src="$1" border="0" alt="" />',$chaine);
}
Il faudrait donc le cas échéant ajouter un width="350" ... Comment puis-je m'y prendre ? Faut il le faire juste avant d'insérer le message dans la BDD ou à l'affichage des messages ?
D'avance merci pour votre aide

Posté : 18 juin 2006, 16:21
par jojolapine
avec getimagesize(), tu devrais pouvoir y arriver tout seul...
un exemple d'utilisation tirer des commentaire du manuel php:
http://fr2.php.net/getimagesize<?php list($w, $h) = getimagesize("image.jpg") ?>
<img src="image.jpg" style="width: <?php=$w?>px; height: <?php=$h?>px;" />
Posté : 18 juin 2006, 16:30
par Invité
Merci jojolapine, effectivement, je pensais à cette fonction, mais c'est plutôt la suite qui me contrarie... parceque dans le post, il n'y a pas que des images...
$chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" '.if(getimagesize($1)>"350") echo" width=\"350\"";.' alt="$2" />',$chaine);
Je pensais à un truc comme ça... mais bon, c'est pas du PHP correct :s je ne sais pas comment l'intégrer en fait :s[/code]
Posté : 18 juin 2006, 16:43
par Ryle
Déjà il faudrait corriger quelques petites erreurs

- tu es en train de construire une chaine pour la stocker dans une variable, pas pour l'afficher à l'écran, le echo n'a donc rien à faire là

- si tu regardes la doc, tu verras que la fonction getImageSize() retourne un tableau de 4 éléménts et pas directement une largeur comparable à ton 350
- enfin dans une concaténation, tu ne peux utiliser de if(), à moins de l'écrire sous sa forme ternaire : ( (condition) ? alors : sinon )

Posté : 18 juin 2006, 17:25
par Invité
Lol, bon je fais un autre essai :
$chaine = preg_replace('#\[img=(.+?)](.+?)\[/img]#si','<img src="$1" border="0" ;
list($width, $height, $type, $attr) = getimagesize($1);
if($width>"350)
{
$chaine .= " width=\"350\"";
}
$chaine .= " alt="$2" />',$chaine);
Je ne pense pas que ce soit ça, parce que le fait de couper la fonction comme ça, ça ne le fait pas :s comment faire alors ?[/code]
Posté : 19 juin 2006, 00:40
par Invité
Personne ne peut m'éclairer ?
Posté : 19 juin 2006, 11:14
par Ryle
Tu n'es pas loin, il te faut juste pour pouvoir faire cela, faire appel à une fonction dans ton remplacement, par exemple :
function checkWidth($img, $maxWidth) {
$tab = getimagesize($img); // on récupère la taille de l'image
if($tab[0] > $maxWidth) // si la largeur est supérieure à maxWidth
return 'width="'.$maxWidth.'"'; // on retourne l'attribut width avé la taille qui va bien
}
// je rajoute un "e" dans le pattern pour que la fonction soit évaluée en php
$pattern = '#\[img=(.+?)](.+?)\[/img]#esi';
// transforme en chaine et ajoute l'appel à la fonction :
$replace = "'<img src=\"$1\" border=\"0\" '. checkWidth('$1', 350) . ' alt=\"$2\" />'";
$chaine = preg_replace($pattern, $replace, $chaine); // le remplcement
a tester, mais ca devrait faire ton affaire

Posté : 21 juin 2006, 02:26
par Invité
Merci pour ton aide ! ça fonctionne presque !
Le seul problème se situe là :checkWidth('$1', 350) . Visiblement, il ne reconnait pas $1, il ne sait pas à quoi renvoie cette variable. Il y a une incompréhension visiblement. J'ai essayé en mettant directement des adresses d'image et ça fonctionne... Donc je sais pas comment modifier pour qu'il sache ce qu'est $1
Posté : 21 juin 2006, 10:13
par Ryle
Je viens de faire le test et j'ai pas eu de soucis, il me prend bien en compte les parenthèses capturantes dans $1 et $2 ....
Essayes éventuellement de les remplacer par \\1 et \\2

Posté : 02 juil. 2006, 20:53
par Invité
j'ai exactement le même problème que "invité" !
Warning: getimagesize(): Unable to access $1 in monsite/index.php on line 7
Warning: getimagesize($1): failed to open stream: No such file or directory in monsite//index.php on line 7
en fait il reconnait pas le $1, comment on peut faire ?
Posté : 28 juil. 2006, 01:35
par razoor
Bonjour,
J'obtiens une autre erreur quant à moi :
Parse error: parse error, unexpected '<' in "#####/fichier.php(23) : regexp code on line 1
Fatal error: preg_replace(): Failed evaluating code: <img src="http://####.gif" alt="" /> in #####/fichier.php on line 23"
Code de ma page :
function checkWidth($img) {
ini_set('allow_url_fopen', '1');
if (@fclose(@fopen($img, 'r'))) {
$tab = getimagesize($img); // on récupère la taille de l'image
if($tab[0] > 350) return ' width="350"'; // on retourne l'attribut width avé la taille qui va bien
}
Ligne d'expression régulière :
$chaine = preg_replace('#\<img src="(.+?)" alt="" />#sie','<img src="$1"'.checkWidth('$1').' alt="" />',$chaine);
Les images que j'utilise n'existent plus toujours, ce qui explique que j'utilise la vérification, pour savoir si l'image existe toujours sur le serveur distant (voire mon serveur).
Posté : 28 juil. 2006, 01:39
par momox
Et en utilisant les css? Comme l'attribut max-width par exemple?
@+
Posté : 28 juil. 2006, 01:53
par razoor
Je te remercie momox, je ne connaissais pas cette propriété, mais elle n'est pas comprise par IE .. Après un petit tour sur google, j'ai vu qu'il existe certes des solutions pour y pallier, mais c'est pas recommandé , car c'est avec du langage propriétaire et du JS. Alors que je programme en XHTML 1.0 Strict
Posté : 28 juil. 2006, 12:25
par razoor
Personne ne pourait m'aiguiller par rapport à mon erreur ?
Posté : 28 juil. 2006, 12:49
par Truc
pour tester l'existence d'un fichier il y a file_exists()
sinon pourquoi échapper le "<" en début d'expression?
et l'option "e" peut être pas obligatoire tout comme "s"
$chaine = preg_replace('#<img src="(.+?)" alt="" />#i','<img src="$1"'.checkWidth('$1').' alt="" />',$chaine);
JE me demande même pour l'option "i"... les balises <img> tu les as mis en place tu sais comment elle sont construites (case).