2010-08-02 7 views
2

J'ai un script qui crée avec succès des miniatures, mais celles-ci sont de qualité médiocre. Y at-il quelque chose que je peux changer dans le script pour améliorer la qualité des vignettes?Miniatures de meilleure qualité

function createThumbnail($filename) { 

    $final_width_of_image = 200; 
    $path_to_image_directory = 'images/fullsized/'; 
    $path_to_thumbs_directory = 'images/thumbs/'; 

    if(preg_match('/[.](jpg)$/', $filename)) { 
     $im = imagecreatefromjpeg($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](gif)$/', $filename)) { 
     $im = imagecreatefromgif($path_to_image_directory . $filename); 
    } else if (preg_match('/[.](png)$/', $filename)) { 
     $im = imagecreatefrompng($path_to_image_directory . $filename); 
    } 

    $ox = imagesx($im); 
    $oy = imagesy($im); 

    $nx = $final_width_of_image; 
    $ny = floor($oy * ($final_width_of_image/$ox)); 

    $nm = imagecreatetruecolor($nx, $ny); 

    imagecopyresized($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy); 

    if(!file_exists($path_to_thumbs_directory)) { 
     if(!mkdir($path_to_thumbs_directory)) { 
      die("There was a problem. Please try again!"); 
     } 
     } 

    imagejpeg($nm, $path_to_thumbs_directory . $filename); 
    $tn = '<img src="' . $path_to_thumbs_directory . $filename . '" alt="image" />'; 
    $tn .= '<br />Congratulations. Your file has been successfully uploaded, and a thumbnail has been created.'; 
    echo $tn; 
} 

Répondre

4

Les seules choses que je peux suggérer avec ce code sont les suivants:

  • Augmenter la $final_width_of_image pour faire une vignette plus grande. Ajouter le troisième quality argument à imagejpeg; selon the PHP manual, il va de 0 à 100 avec 100 étant la meilleure qualité. Ne pas utiliser le format JPEG pour vos vignettes.
  • Utilisez imagecopyresampled pour obtenir un meilleur algorithme d'interpolation de pixels.
+0

Merci je l'ai changé 'imagejpeg ($ nm, $ path_to_thumbs_directory. $ filename, 100);' Je vois une petite différence de qualité mais 'imagecopyresampled' fait vraiment la différence! :) Le script recadre les images originales en utilisant les zéros. –

+0

Correction, il ne recadre pas l'image. Juste change la largeur :( –

1

imagecopyresampled donne beaucoup de meilleurs résultats (et ne pas utiliser le paramètre de qualité de imagejpeg comme déjà mentionné

+0

'imagecopyresampled' est impressionnant –

1

Peut-être essayer ce code, qui utilise ImageCopyResampled:.!

function createImage($in_filename, $out_filename, $width, $height) 
{ 
    $src_img = ImageCreateFromJpeg($in_filename); 

    $old_x = ImageSX($src_img); 
    $old_y = ImageSY($src_img); 
    $dst_img = ImageCreateTrueColor($width, $height); 
    ImageCopyResampled($dst_img, $src_img, 0, 0, 0, 0, $width, $height, $old_x, $old_y); 

    ImageJpeg($dst_img, $out_filename, 80); 

    ImageDestroy($dst_img); 
    ImageDestroy($src_img); 
} 
+0

merci j'ai essayé la fonction, mais je reçois beaucoup d'erreurs :( –