Génération miniature d'images à l'upload

Mammouth du PHP | 620 Messages

11 avr. 2018, 08:05

Bonjour,
j'ai un code qui me permet de généré lorsque je fais un upload d'image une miniature de 400px de large (ou plus ou moins en fonction).
le code fonctionne bien la miniature est bien créée et enregistrée sur mon serveur mais par contre la qualité de cette miniature est vraiment très très mauvaise ! et donc pas présentable.

Voilà mon code, serait-il possible d’améliorer la qualité de l'image miniature ou de ne pas avoir de perte de qualité ?

Code : Tout sélectionner

if(!empty($_FILES)) { $avatar = $_FILES['avatar']; $avatar_name = $avatar['name']; $ext = strtolower(substr(strrchr($avatar_name,'.'),1)); $ext_aut = array('jpg','jpeg','png','gif'); function check_extension($ext,$ext_aut) { if(in_array($ext,$ext_aut)) { return true; } } $valid = (!check_extension($ext,$ext_aut)) ? false : true; $erreur = (!check_extension($ext,$ext_aut)) ? 'Veuillez charger une image' : ''; if($valid) { $max_size = 5000000; if($avatar['size']>$max_size) { $valid = false; $erreur = 'Fichier trop gros'; } } if($valid) { if($avatar['error']>0) { $valid = false; $erreur = 'Erreur lors du transfert'; } } if($valid) { $path_to_image = 'images/fullsize/'; $path_to_min = 'images/min/'; $filename = sha1(uniqid($avatar_name)); $source = $avatar['tmp_name']; $target = $path_to_image . $filename. '.'. $ext; move_uploaded_file($source,$target); if($ext == 'jpg' || $ext == 'jpeg') {$im = imagecreatefromjpeg($path_to_image.$filename.'.'.$ext);} if($ext == 'png') {$im = imagecreatefrompng($path_to_image.$filename.'.'.$ext);} if($ext == 'gif') { $im = imagecreatefromgif($path_to_image.$filename.'.'.$ext);} $ox = imagesx($im); $oy = imagesy($im); $nx = 400; $ny = floor($oy *($nx/$ox)); $nm = imagecreatetruecolor($nx,$ny); imagecopyresized($nm, $im, 0,0,0,0, $nx,$ny,$ox,$oy); imagejpeg($nm, $path_to_min.$filename.'.'.$ext); $nom_image = $filename.'.'.$ext; $req = $bdd->prepare('INSERT INTO upload(nom) VALUES(:nom)'); $req->execute(array('nom'=>$nom_image)); $req->closeCursor(); $success = 'Upload ok'; } }

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 avr. 2018, 10:24

Bonjour,

Tu utilises la fonction imagecopyresized() pour faire ton redimensionnement, il y a un indice dans la doc pour répondre à ta problématique :
http://php.net/imagecopyresized
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 620 Messages

11 avr. 2018, 10:40

Ok merci... du coup j'utilise imagecopyresampled à la place qui donne une miniature bien plus belle (mais qui reste un peu flou).

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 avr. 2018, 18:56

Normalement tu devrais pouvoir avoir une miniature quasi-parfaite et donc pas de flou (si tu ne zoomes pas dans l'image généré bien sûr)

Il y a un 3ème paramètre à la fonction imagejpeg() qui permet de définir la qualité attendue (entre 0 et 100, par défaut à 75), tu peux faire quelques essais pour voir ce que ça donnerai en le mettant à 80/85 ou 90.
https://php.net/imagejpeg

Attention à vérifier le poids de l'image quand tu joue sur la qualité car en le mettant à 100 tu risque d'avoir des surprises ;)
Quand tout le reste a échoué, lisez le mode d'emploi...