Redimenssionement d'images en conservant la qualité

Eléphant du PHP | 428 Messages

13 oct. 2009, 16:37

Bonjour,

Je me demandais si il existait un paramètre me permettant de redimensionner une image en conservant 90 à 100% de sa qualité ?

Voici mon code de redimensionnement :
// ON VA CREER LES MINIATURES D'IMAGES
// On teste si le fichier n'est pas vide
if($file_size){
// On crée les images en fonction du type
if($file_type == "image/pjpeg" || $file_type == "image/jpeg"){
$new_img = imagecreatefromjpeg($file_tmp);
}elseif($file_type == "image/x-png" || $file_type == "image/png"){
$new_img = imagecreatefrompng($file_tmp);
}elseif($file_type == "image/gif"){
$new_img = imagecreatefromgif($file_tmp);
}


// On liste la hauteur et la lageur et on défini le ratio
list($width, $height) = getimagesize($file_tmp);
$imgratio=$width/$height;

$newwidth = $Thumbs_Mini_Height*$imgratio;
$newheight = $Thumbs_Mini_Height;

//function for resize image.
if (function_exists(imagecreatetruecolor)){
$resized_img = imagecreatetruecolor($newwidth,$newheight);
}else{
die("Erreur: Votre hébergement doit disposer de la librairie GD version 2 ou plus");
}
imagecopyresized($resized_img, $new_img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
//save image
ImageJpeg ($resized_img,''.$dirpictures.'thumbs/mini/'.$file_name.'');
ImageDestroy ($resized_img);
ImageDestroy ($new_img);
chmod("".$CfgRelDir."/uploads/thumbs/mini/".$file_name."", 0644);
//print message
echo '<br>Image MINI Thumb: <a href='.$dirpictures.'thumbs/mini/'.$file_name.'>'.$dirpictures.'thumbs/mini/'.$file_name.'</a><br />';
}
Merci pour vos renseignements,
Raph

Administrateur PHPfrance
Administrateur PHPfrance | 977 Messages

13 oct. 2009, 16:42

regarde ImageCreateTrueColor
pro : http://www.ohweb.fr -> studio de développement en PHP, expertise en e-commerce, certifié PrestaShop
perso : http://www.olecorre.com -> un dico de termes informatiques

J'ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone. [Bjarne Stroustrup]

ViPHP
fab
ViPHP | 2657 Messages

13 oct. 2009, 17:36

Pour avoir eu à gérer ce problème sur un site dont la principale activité est la diffusion de photo, je te conseille d'utiliser imagecopyresampled(), ça effectue un ré-échantillonnage de ton image lors de son redimensionnement ce qui permet de garder une bonne qualité tout en gagnant du poids.

Tu as un très bon exemple dans les commentaires de la doc officielle je le met ci-dessous :
<?php
// Le fichier
$filename = 'test.jpg';
$percent = 0.5;

// Content type
header('Content-type: image/jpeg');

// Calcul des nouvelles dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Redimensionnement
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Affichage
imagejpeg($image_p, null, 100);
?>
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

ViPHP
AB
ViPHP | 5818 Messages

13 oct. 2009, 19:27

Petite remarque :

J'utilise la technique indiquée par Fab qui me parait la plus optimisée (j'ai planché longtemps sur le pb car ancien photographe). Mais quelque soit la valeur de qualité indiquée dans la fonction imagejpeg, on est loin d'atteindre la qualité d'un redimensionnement effectué dans un logiciel photo.

Cela vient entre autre du fait qu'il pas de possibilité d'accentuation des contours lors du redimensionnement contrairement aux logiciels photos. Ce serait bien que php nous propose une fonction de ce type, mais ce n'est apparemment pas encore disponible.

Sinon concernant le paramètre de qualité pour la fonction imagejpeg, j'ai trouvé que 88 était un bon compromis (évidemment ça reste subjectif). Au delà les images deviennent très lourdes sans gagner significativement en qualité.

Eléphant du PHP | 428 Messages

13 oct. 2009, 19:40

merci pour vos réponses ^^

J'ai effectué les changements suivants:
- Multi-upload (5 files)
- Création de 2 miniatures à la volée calculée sur le 'height' de l"image (113px et 480px) en utilisant imagecopyresampled
- Enregistrement dans les répertoires individuels des images et miniatures

je suis prêt pour a suite !

Merci ;)