CLASSE DE REDIMENSIONNEMENT D'IMAGES PHP

ro2kpdp Messages postés 2 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 19 mai 2010 - 19 mai 2010 à 09:20
kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010 - 13 oct. 2010 à 21:47
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/51773-classe-de-redimensionnement-d-images-php

kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010
13 oct. 2010 à 21:47
hhhhhh ok men :)
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
11 oct. 2010 à 11:22
La source est sur cette page. A vous d'adapter l'exemple selon vos besoins.

Cordeialement,
//Beejeridou */
kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010
7 oct. 2010 à 15:51
j'ai besoin d'une classe qui fait L'upload multiple plus le redimensionnement des images en 3 types l'homothétie, le crop et le wallpaper. si vous vous avez une source aider moi SVP
kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010
7 oct. 2010 à 15:12
si j'ai trouver sur d'autre source d'upload crée en POO l'upload multiple sans passé par le flash
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
7 oct. 2010 à 12:45
Salut,
Il te suffit de déclarer plusieurs objets. Après, j'imagine que tu gères l'upload multiple en Flash? php/HTML ne le gère pas à lui tout seul.
kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010
7 oct. 2010 à 06:08
salut est ce qu'il y a une possibilité d'avoir envoyer plusieurs fichier a la foi le cas de l'upload multiple tu peut ajouter une classe pour l'upload multiple SVP
nobitos Messages postés 7 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 24 septembre 2010
24 sept. 2010 à 11:35
Oui, l'image est parfaitement bien redimensionnée, et surtout, (c'est ça qui m'intéresse) elle ne pèse plus que...350KO environ au lieu de 2,5MB ! ça, c'est super.
Je ne fais qu'un seul redimensionnement : Homothéty.
Les autres type de redim. sont mis en commentaires.

J'avais fais le test de n'appeler que la classe UPLOAD, mais je ne me souviens plus du résultat en termes de délais d'éxécution (à ce moment, ce n'est pas ce qui m'intéressait).
J'aurai plus d'information ce soir quand je serai chez moi.

A+ et bonne journée,
cordialement,
Nobitos.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
24 sept. 2010 à 11:06
Ah oué... 20 secondes en local (même en ligne) n'est pas normal!
Ton image est bien redimensionnée à la fin comme tu le voulais? combien fais tu de redimensionnements? as tu essayé d'uploader juste le fichier (juste utiliser la classe upload, sans la classe resize)? as tu essayé d'uploader une image un peu moins lourde (<2mo)?

Cordialement,
//Beejeridou */
nobitos Messages postés 7 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 24 septembre 2010
24 sept. 2010 à 10:37
Bonjour,

merci pour ta réponse rapide.
En effet, tu m'aides, et plus qu'un brin !
J'ai un peu farfouillé dans les différents tuto sur la POO que l'on peut trouver sur le Net, et j'avais fini par comprendre qu'il fallait appeler les méthodes dont j'avais besoin afin de donner le nom que je voulais pour mon fichier (méthodes 'magiques' _SET et _GET).
Donc, PREFIXENAME était vide...parce que je n'appelais pas la méthode !
Le nom lui-meme était finalement constitué uniquement du UNIQNAME.
Pour la DIRECTORY, je réessaierai ce soir (je suis à mon boulot) : je pense que ça plantait parce que je ne devait pas indiquer le bon chemin...

Quoi qu'il en soit, je suis très content de ce code qui me fait beaucoup mieux comprendre la POO (30 ans de COBOL, ça n'aide pas !) et je vais tenter de développer mon site de cette façon.

Une dernière chose : le temps d'éxécution est terriblement long pour une seule image (dans les 20 secondes environ).
La photo pèse environ 2,5MB et je teste en local (WAMP): est-ce déjà beaucoup trop gros pour un UPLOAD ?

Encore merci,
cordialement,
Nobitos.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
24 sept. 2010 à 10:06
Hello,
Il faut d'abord savoir qu'une classe fonctionne comme un ensemble. Je dis ça car je te conseille de laisser la methode createDir(), car elle fonctionne de manière native si l'endroit de destination n'existe pas.
Ensuite, tu as des "SETTERS" et des "GETTERS": ce sont des methodes pour alimenter la classe, àprès son implémentation. C'est d'ailleurs pour ça qu'elles sont de type "public" alors que les autres sont de type "private". Ces valeurs ont pour le plus souvent un comportement "par défaut", comme $this->name ou $this->prefixeName. En clair, si tu n'appelles pas $upload->setName, ton fichier prendra un nom unique. Idem pour $upload->setPrefixeName.

Si tu veut donner ton nom du fichier d'origine: par exemple:

$upload = new UploadFile('nom_du_input_file');

$upload->setType("jpg/jpeg/gif/png"); // pas de slash a la fin
$upload->setPath("images/encore/un/repertoire/etc"); // pas de slash a la fin

$upload->setPrefixeName("prefixe-");
$upload->setName($_FILES['nom_du_input_file']['name']);

$up = $upload->upload();

En plus, le nom sera automatiquement mis sans les accents et caractères spéciaux, ce qui peut poser beaucoup de problèmes sur des serveurs linux par exemple.

Il est vrai que dans mon exemple, je n'ai pas changé le nom du fichier source car il est changé dans la classe imgResize par la suite. Mais ce n'est que dans le cas d'un upload d'images.

En espérant avoir pu t'aider un brin.

Cordialement
//Beejeridou */
nobitos Messages postés 7 Date d'inscription vendredi 13 octobre 2006 Statut Membre Dernière intervention 24 septembre 2010
23 sept. 2010 à 18:10
Bonjour à tous,

bravo à Beejeridou pour ce code, que je trouve vraiment bien conçu.
Cela me permet surtout d'approcher la POO.

Je débute en PHP, (POO ou pas !) et j'essaie de comprendre...

Par exemple, je ne comprends pas du tout comment est alimentée la variable "name", qui sert à UPLOADER le fichier ???
D'autre part, la variable "prefixeName" est toujours vide ??
Merci donc de m'aider à comprendre comment sont alimentées ces deux variables.

(Je précise que je n'appelle plus la fonction qui créé la Directory, car celle-ci existe déjà et je veux la conserver. D'ailleurs, si je laisse le code tel que avec l'appel à la fonction...ça plante !).

En fait, je veux donner au fichier le nom d'origine, qui se trouve donc dans :

$_FILES['nom_du_input_file']['name']

Si tu pouvais éclairer ma lanterne, cela m'aiderait considérablement !!

En espérant avoir été suffisamment clair,
cordialement,
nobitos.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
31 août 2010 à 14:32
Je ne sais pas comment mais on m'informe que l'exemple d'instanciation de la classe a disparu du code source... je le met ci-dessous (basique):

<?php
require_once("class.UploadFile.php");
require_once("class.ImageResize.php");

//FORMULAIRE UPLOAD IMAGE
$formImg = '
<form method="post" enctype="multipart/form-data">

</form>
';
echo $formImg;

if(isset($_FILES['nom_du_input_file'])) {
$upload = new UploadFile('nom_du_input_file');

$upload->setType("jpg/jpeg/gif/png"); // pas de slash a la fin
$upload->setPath("images/encore/un/repertoire/etc"); // pas de slash a la fin

$up = $upload->upload();

$message = "";

if($up) {
$img = new ImageResize($upload->getPath(), $upload->getName(), $upload->getExtension(), 6);
$img->setAlphaMode();
//$img->setForceDimensions();

$img->resize("homothety", $upload->getPath(), "100");
$img->resize("homothetyHeight", $upload->getPath(), "100");
$img->resize("crop", $upload->getPath(), "10", "nom_image_perso");
$img->resize("crop", $upload->getPath(), "100/60", "crop_paysage");
$img->resize("crop", $upload->getPath(), "60/100", "crop_portrait");
$img->resize("wallpaper", $upload->getPath(), "", "wallpaper");

$img->setDeleteSource(); //ne fonctionne pas tres bien, je ne comprend pas trop pourquoi...

$message = $img->getErrorResize();
}

$message = $upload->getErrorUpload();

echo $message;
}
?>

Plus plus!
//Beejeridou
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
10 juin 2010 à 14:41
perso je me serais servi du parametre $imgName pour renommer l'image. Dans la classe UploadFile, tu peux retourner juste le nom du fichier, puis le passer dans ImageResize.
Ta manière de procéder peux fonctionner si tu passes par la classe UploadFile avant, car elle enlève les caractères spéciaux qui peuvent générer des bugs.

Cordialement!
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
10 juin 2010 à 12:59
ok, je vais vérifier ça dès demain, en attendant je poste ici une petite astuce:
pour faire en sorte que les vignettes aient le même nom que l'image source:

dans le fichier class.imageResize.php, fonction resize:
j'ai juste commenté la ligne:

//$this->uniqName($imgName);

l'auteur de cette class pourra me dire si c'est pas un peu barbare ce que j'ai fait... ;)
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
10 juin 2010 à 10:53
J'ai ajouté la méthode getPathImg().
Je ne l'ai pas testée^^ désolé. Dis moi si ca marche. Tu dois normalement l'appeler après chaque méthodes resize();

L'idéal serait de retourner un tableau contenant toutes les images redimentionnées... c la prochaine modif.
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
9 juin 2010 à 20:06
en fait j'ai réussi à faire un echo sur le chemin d'un des fichiers, celui qui est uploadé sans resize:
$chemin_photo = $upload->getPath()."/".$upload->getName().$upload->getExtension();
echo $chemin_photo;

que j'ai mis tout à la fin du fichier class.imageResize.php quand le fichier uploadfile est appelé.

par contre pour celui qui est redimensionné... j'y arrive pas.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
9 juin 2010 à 17:45
Bien vu, je te fais ça dès que j'ai un brin de temps (surement demain).
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
9 juin 2010 à 16:36
bonjour,
je souhaiterais, après l'upload, pouvoir récupérer les chemin d'accès(avec les noms des fichiers) vers les images uploadées, où faut il aller regarder et que faut il récupérer svp?
j'en aurais besoin pour les affectés à 2 champs d'un formulaire d'une page que j'appellerais à la fin de l'upload...
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
7 juin 2010 à 12:26
les noms des variables étaient suffisamment explicite... ;)
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
7 juin 2010 à 10:23
J'ai oublié de le préciser^^ désolé!
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
7 juin 2010 à 02:03
oups, autant pour moi, il suffisait de virer le nom dans l'appel de la fonction...
elran Messages postés 22 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 5 juin 2010
7 juin 2010 à 01:45
super cette class!
par contre, le nom du fichier redimensionné étant le même pour chaque type de redimensionnement, si l'on upload/resize plusieurs fichiers l'un après l'autre ils s'écrasent...
nom_du_dichier_d_origine + type_de_resize aurait était nickel comme nom de fichier... ;)
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
27 mai 2010 à 14:39
Là c'est Tout bon pour moi, je n'ai pas remarqué de nouvelle amélioration possible ... pour l'instant.
J'hésiterai pas à revenir poster s'il y a besoin.

Merci pour ces MAJ rapides et efficaces

@plus
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
27 mai 2010 à 00:58
Yesss! ben au final tu auras plus testé ma classe que moi! ET C'EST GENIAL!!

J'ai trouvé la solution:

Il suffit maintenant de déclarer la methode setAlphaMode() et.... BINGO!!!

(je met la modif dans les 5 prochaines minutes...)
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
26 mai 2010 à 23:38
Re ...
Tout compte fait, après diverses images uploadées et redimensionnées, je me suis trouvé confronté à un nouveau problème : la transparence des PNG.
Après redimensionnement, tout ce qui est transparent devient noir ... réglage à faire ?
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
26 mai 2010 à 20:22
Bravo!
Tout fonctionne nikel : PNG et homothétie sur la hauteur ...
Content d'avoir fait avancer cette classe d'un petit pas!

Belle classe
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
26 mai 2010 à 18:45
Hello, et merci à toi Marsbidon!

Voilà, j'ai donc rajouté le nouveau paramètre "homothetyHeight", pour fabriquer une image homothetique contrainte sur la hauteur.

Pour le png, j'ai également fait une pt'te modif qui fonctionne chez moi, dis moi si c'est pareil pour toi
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
26 mai 2010 à 17:19
petite question subsidiaire en plus de mon problème de PNG :

comment ne redimensionner que la hauteur ?
Je voudrai que mes images soient redimensionnées avec une hauteur de 100px mais en conservant le ratio largeur/hauteur...
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
26 mai 2010 à 15:53
Le type mime png n'existe pas sur selfhtml... je l'ai trouvé ici : http://www.sfsu.edu/training/mimetype.htm

J'ai essayé, j'ai ajouté :
"
case "png": case "PNG":if($mimeType "image/png" || $mimeType "image/ppng") return true; break;
"

Cela ne génère plus d'erreur, l'image est bien créé avec le bon nom mais elle est vide.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
26 mai 2010 à 15:25
Cette erreur vient de la classe upload. Précisément de la méthode verifMimeType(), où dedans je n'ai pas précisé le type-mime pour le png.

Tu peux rajouter autant d'exceptions que tu le souhaites dans cette methode.

Voici une liste de type mime:
http://fr.selfhtml.org/divers/typesmime.htm

Bye!
marsbidon Messages postés 14 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 16 septembre 2008
26 mai 2010 à 12:16
Bonjour,

Le redimensionnement ne fonctionne pas avec les png?
A chaque essai de redimensionnement de png j'ai :
"ERREUR : Le fichier semble être corrompu"

Y-a-t-il une astuce?

merci!
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
24 mai 2010 à 16:40
Ben les dimensions sont données quand tu définis tes méthodes resize()...

Par exemple, tu veux absolument une image rectangle (pour une bannière pub par ex), de 160px x 1300px, tu fais:

$img = new ImageResize($upload->getPath(), $upload->getName(), $upload->getExtension(), 1);

$img->setForceDimensions();
$img->resize("crop","ici/etla", "160/1300");

En espérant avoir pu t'aider.
pietje24 Messages postés 2 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 24 mai 2010
24 mai 2010 à 16:27
J'avais bien vu, mais comment donner les dimensions voulues ?
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
24 mai 2010 à 15:20
Bonjour,
Il te suffit d'initialiser la methode setForceDimensions().

C'est la ligne que j'ai commenté dans l'exemple que j'ai fourni. Petit rappel, si l'image est plus petite que le redimensionnement demandé, la qualité sera moins bonne vu que les pixels seront agrandis.
pietje24 Messages postés 2 Date d'inscription mardi 16 juin 2009 Statut Membre Dernière intervention 24 mai 2010
24 mai 2010 à 15:09
Bonjour,
ces classes sont super.
Avant de bricoler, peux-tu me donner la marche à suivre pour forçer les dimensions ?
Je te remercie
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
24 mai 2010 à 14:32
Je suppose que tu as rajouté case "JPG": case "JPEG" à la ligne 165?
KasPe Messages postés 9 Date d'inscription samedi 19 avril 2008 Statut Membre Dernière intervention 8 décembre 2010
24 mai 2010 à 11:38
J'ai pas tout regardé, juste testé vite fait et je dis déjà merci.
Un petit apport sur ta classe upLoad, j'ai rajouté les extensions en majuscule pour le typeMime. Mon appareil photo génère des fichiers blabla.JPG qui étaient considérés comme corrompus.
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
23 mai 2010 à 17:26
Oh! je dois dire que je ne m'attendais pas à autant^^ en tous cas, ravi que ca te plaises!
Bonne continuation!
kharmouza Messages postés 5 Date d'inscription jeudi 19 juin 2008 Statut Membre Dernière intervention 13 octobre 2010
23 mai 2010 à 15:54
Félicitation tu est un génie ;)
beejeridou Messages postés 35 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 21 mai 2010
19 mai 2010 à 10:30
Alors, ui, je n'ai pas précisé, mais l'écriture sur l'image ne se fait que sur un redimensionnement de type "wallpaper".

J'ai fais comme ca car je n'ai pas fait de méthode pour calculer la taille de la police dynamiquement en fonction de la taille de la nouvelle image... Certainement une modification à apporter dès que j'ai un brin de temps.
ro2kpdp Messages postés 2 Date d'inscription mercredi 1 juillet 2009 Statut Membre Dernière intervention 19 mai 2010
19 mai 2010 à 09:20
Bonjour,
Felicitation puissante fonction mais je n'arrive pas a ecrire sur l'image.

encore Merci
Rejoignez-nous