CLASS PHP 5 POUR CHARGEMENT ET REDIMENSIONNEMENT D'IMAGES (SI NÉCÉSSAIRE, POUR L

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 28 janv. 2006 à 11:04
suziesuzy961 Messages postés 1 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 18 février 2008 - 18 févr. 2008 à 16:40
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35783-class-php-5-pour-chargement-et-redimensionnement-d-images-si-necessaire-pour-les-formats-supportes-par-la-gd-gif-jpeg-png

suziesuzy961 Messages postés 1 Date d'inscription lundi 11 février 2008 Statut Membre Dernière intervention 18 février 2008
18 févr. 2008 à 16:40
Bonjour,

pour une newbie dans la POO, je trouve cette classe excellente : le code est facile à lire et à prendre en main ! Suffisamment flexible pour l'adapter à mes besoins.

Un grand merci !!
Utilisateur anonyme
1 sept. 2007 à 14:49
J'ai modifié la partie pour modifier la taille de la photo :

function redim()
{
//On essaye de redimensionner
// On vérifie d'abord si la librairie GD est activée
if(extension_loaded('gd'))
{
// Si oui, on lance la méthode pour redimensionner
// Calcule des nouvelles dimensions
list($largeur_orig, $hauteur_orig) = getimagesize($_FILES[$this->nom_champs]['tmp_name']);
// Un peu des mathématiques...
if($largeur_orig > $this->largeur || $hauteur_orig > $this->hauteur)
{
// ORIGINE
//if($largeur_orig >= $hauteur_orig)
//{
// $coef = $largeur_orig / $hauteur_orig;
// $largeur = $this->largeur;
// $hauteur = ceil($this->hauteur / $coef);
// }
//else
//{
// $coef = $hauteur_orig / $largeur_orig;
// $hauteur = $this->hauteur;
// $largeur = ceil($this->largeur / $coef);
// }
///

//code modifié
if($largeur_orig >= $hauteur_orig)
{
$coef = $this->largeur / $largeur_orig;
$largeur = $this->largeur;
$hauteur = ceil($hauteur_orig * $coef);
}
else
{
$coef = $this->hauteur / $hauteur_orig;
$hauteur = $this->hauteur;
$largeur = ceil($largeur_orig * $coef);
}
}
else
{
$largeur = $this->largeur;
$hauteur = $this->hauteur;
}


PAR CONTRE,
J'ai un souci avec mon hébergeur free : la class ne fonctionne pas.
C'est un problème avec les exeptions.

voici le message d'erreur :
Parse error: syntax error, unexpected '{' in /mnt/152/sda/1/d/sortirfute/objet/fiche_modif_img1.inc.php on line 29

voici le code :
28- try
29- {
30- $ext=$charger->executer();

Est ce un problème de librairie ou de version php ?
Est ce que vous avez une solution pour corriger le problème ?


Merci.
djshaker Messages postés 4 Date d'inscription jeudi 13 novembre 2003 Statut Membre Dernière intervention 3 juin 2010
13 févr. 2006 à 15:51
Petite amélioration à éffectué.. quand tu donne une largeur ou une hauteur fixe, il se base sur la largeur ou hauteur d'origine pour redimensionner => les proportions ne sont pas conservé.

Bon courage.
www.orlinz.com
f bnkcm Messages postés 57 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 6 septembre 2006
6 févr. 2006 à 12:41
Merci BABID.
Merci GRanard pour les idées, j'ai modifié le code et c'est plus optimisé là.
Merci à tous!
++
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
2 févr. 2006 à 00:27
On m'a demandé de commenter cette classe :)

La première chose qui marque, c'est bien le $array qui n'est pas très convivial dans le constructeur.
Tu peux utiliser des const DEFAULT_LARGEUR = 140; par exemple pour spécifier tes valeurs par défaut.
Au sujet des "options" de tableau comme ca, essaies de faire comme PHP... Une clé et une valeur que tu vas chercher l'information avec foreach.
Ainsi tu vas faire un truc comme foreach($array as $key => $val) ........ $this->$key = $val; (avec une vérification au préalable pour ne pas écrire n'importe quoi dans ta classe... comme un isset) -> donc plus besoin de else, mettre les self::DEFAULT_ au début.
Même chose pour les types d'image autoriser... faire une énumération avec const... TYPE_GIF 1;, TYPE_JPG 2;, TYPE_JPEG = 2;...
Je ne sais pas si tu sais mais le AND n'a pas la même précédence que &&... (OR aussi)

Ta classe dépend de $_FILES['fichier'] et ne devrait pas... ce 'fichier' devrait être passé en paramètre quelque part.
Utilise les === et les !== pour une meilleure compréhension de code et une meilleure rapidité.

Tes méthodes ne font que ce suivre et ca ne veut pas dire grand chose... existe, extension, type, poids, executer... c'est pas une très bonne technique tout ça... Il faudrait plutôt dans exécuter faire un checkPoids, checkType, check...

Bah voilà c'est déjà ça :)
cs_babid Messages postés 49 Date d'inscription dimanche 21 septembre 2003 Statut Membre Dernière intervention 17 décembre 2008
29 janv. 2006 à 17:10
Merci beaucoup, très utile comme class.
f bnkcm Messages postés 57 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 6 septembre 2006
29 janv. 2006 à 09:48
FhX => J'ai réglé ça avant ta deuxième réponse ^^, instanciation avec peu de paramètres à part et execution à part:
// $charger = new charger(); pour laisser les paramètres par défauts
$charger = new charger($array);
// gestion des Exceptions try... catch...
try
{
$charger->existe();
echo 'L\'image a été chargée avec succès!';
}
catch(Exception $e)
{
echo $e->getMessage();
}

Merci.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 janv. 2006 à 18:39
Justement, si tu veux faire un renommage dynamique, tu t'y prends mal.

L'instanciation doit être le moment où tu charges tes paramètres. Pas la où tu exécutes le code à proprement parler.
Pour pouvoir exécuter du code normalement, tu dois passer par une méthode à part.
Hors toi, tu fais : instanciation => redimensionnement direct.

C'est pas comme ca qu'il faut faire, tu dois séparer les deux.

Voila pourquoi tu as trop de paramètres d'ailleurs dans tes méthodes. D'ailleurs, ta classe est plus un concentré de fonctions purs plutôt que d'un code orienté objet :)
C'est aussi pour cela que je le trouve lourd (bien plus qu'un code OO :p)
f bnkcm Messages postés 57 Date d'inscription dimanche 2 mai 2004 Statut Membre Dernière intervention 6 septembre 2006
28 janv. 2006 à 16:47
Salut,
Merci pour vos critiques, je prendrai ça en considération, par contre, malalam, j'ai pas trop compris ce que tu suggères ici:
"Tu aurais pu créer une propriété privée, un tableau, avec pour clef, le type renvoyé par la fonction getimagsiez, et valeur, le type sous forme de chaine : 'png', 'gif'...cela t'aurait épargné quelques lignes de code."
Puis, pour "Pourquoi avoir rendu toutes tes propriétés publiques...?", là j'ai besoin un peu plus d'orientation sur l'utilisation de private, public, protected... merci de bien m'éclaircir ce point, je suis à l'écoute ^_^
FhX => Tout à fait d'accord avec toi pour le "trop de paramètres" à faire passer, sinon pas pour le préfixe et suffixe, ceux là je préfère les garder comme ça (pour un renommage dynamique nom_01.jpg, nom_02.jpg... tu vois).
Merci, je vais modifier.
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
28 janv. 2006 à 13:19
Bon, comme c'est du PHP5.. il faut utiliser les exceptions !! C'est pas pour rien :)

Throw new Exception('Message d\'erreur !');
C'est pas compliqué en plus niveau utilisation !! !!

Par contre, j'aime pas ton instanciation de ta classe. Tu fais en sorte que celui qui va utiliser ta classe va faire exactement le tableau que tu lui demandes.
Hors, il y a trop de paramètres à passer d'un coup !

Par exemple : $type_aut. Il faut la mettre dans la classe elle-même ! Pas besoin de l'appeler hors classe ! A la limite créer une méthode pour pouvoir modifier ca... pourquoi pas ! Mais certainement pas lors de l'instanciation !
Pareil pour le préfixe et le suffixe ===> dans la classe ca !

Bref, c'est encore un peu trop lourd pour moi ! :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
28 janv. 2006 à 11:04
Hellp,

rapidement, pas trop le temps là : quelques imperfections.
Tes switch sur le type sont inutiles. Et répétitifs. Tu aurais pu créer une propriété privée, un tableau, avec pour clef, le type renvoyé par la fonction getimagsiez, et valeur, le type sous forme de chaine : 'png', 'gif'...cela t'aurait épargné quelques lignes de code.

Pareil pour les messages d'erreurs, tu aurais dû les définir dans les propriétés de ta classe, sous forme de tableau, ou de constantes, comme tu veux. Un tableau avec comme clef la valeur du switch que tu fais, et clef, le message d'erreur. Ca t'aurait encore épargné quelques lignes de code inutiles.

Pourquoi avoir rendu toutes tes propriétés publiques...?
En l'améliorant, je pense que ça peut devenir une classe utile et intéressante :-) Mais il faut mieux la penser. Avec une classe parente abstraite par exemple, et une classe fille pour chaque 'type' d'image. Tu réduirais sérieusement ton code, il serait plus clair.
Rejoignez-nous