2010-08-06 5 views
0

Pour un site Web que je cours, les utilisateurs peuvent télécharger des images qu'ils ont dessinées dans une galerie. Nous créons une vignette et une petite vue de cette image pour l'afficher aux autres utilisateurs (cliquer sur l'image de la petite vue pour afficher l'image en taille réelle). Dans cet esprit, j'ai créé un script de redimensionnement très simple. Dans la plupart des cas, ce script fonctionne parfaitement. Cependant, je suis tombé sur un seul cas étrange dans lequel le script bousille entièrement.Comment redimensionner correctement de grandes images dans PHP

Lorsque vous exécutez le fichier http://img191.imageshack.us/img191/2268/935full.png (1641x3121) à travers le script (qui crée une miniature avec une largeur ou hauteur maximale de 150 et une autre de 400), nous obtenons une miniature parfaite http://img267.imageshack.us/img267/5803/935thumb.png (78x150) et une petite image vue à la bonne taille, mais qui est coupé et étiré http://img28.imageshack.us/img28/4002/935show.png (211 x 400). Dans cet esprit, ma question est: est-ce un problème en PHP ou une erreur de logique? Et comment puis-je le réparer?

Nous vous remercions de votre temps. Le code que j'utilise pour créer ces vignettes est ci-dessous.

<?php 
/** 
* Creates a thumbnail for any type of pre-existing image. Always saves as PNG image 
* 
* @param string - The location of the pre-existing image. 
* @param string - The location to save the thumbnail, including filename and extension. 
* @param int - The Maximum Width, Default of 150 
* @param int - The Maximum Height, Default of 150 
* @return bool - Success of saving the thumbnail. 
*/ 
function imagecreatethumbnail($file,$output,$max_width = 150,$max_height = 150) 
{ 
     $img = imagecreatefromstring(file_get_contents($file)); 
     list($width, $height, $type, $attr) = getimagesize($file); 
     if($height > $max_height || $width > $max_width) 
     { 
       if($width > $height) 
       { 
         $thumb_width = $max_width; 
         $thumb_height = ceil(($height * $thumb_width)/$width); 
       } 
       else 
       { 
         $thumb_height = $max_height; 
         $thumb_width = ceil(($width * $thumb_height)/$height); 
       } 
     } else { 
       $thumb_width = $width; 
       $thumb_height = $height; 
     } 
     imagesavealpha($img,true); 
     $thumb = imagecreatetruecolor($thumb_width,$thumb_height); 
     imagesavealpha($thumb,true); 
     imagealphablending($thumb,false); 
     imagecopyresampled($thumb,$img,0,0,0,0,$thumb_width,$thumb_height,$width,$height); 
     $return = imagepng($thumb,$output); 
     imagedestroy($img); 
     imagedestroy($thumb); 
     return $return; 
} 
+0

Le script est-il interrompu (en raison de max_execution_time ou de memory_limit)? – JochenJung

+0

Non, il fonctionne complètement. – Navarr

+0

L'exécution de votre code avec 'imagecreatethumbnail (" http://img191.imageshack.us/img191/2268/935full.png "," m.png ", 400, 400);' produit l'image correcte. PHP 5.2.6-1 + lenny8. Le GD de Php est la version 5.2.6.dfsg.1-1 + lenny8. – jmz

Répondre

0

Cela semble être un bug en PHP.

0

Avez-vous essayé de supprimer les fonctions ceil()? Les fonctions d'image convertiront automatiquement les flottants en entiers de toute façon.

EDIT:

Voir si cela fonctionne:

if($width > $max_width && $height * $thumb_width/$width < $max_width) 
{ 
    $thumb_width = $max_width; 
    $thumb_height = $height * $thumb_width/$width; 
} 
elseif($height > $max_height && $width * $thumb_height/$height < $max_height) 
{ 
    $thumb_height = $max_height; 
    $thumb_width = $width * $thumb_height/$height; 
} 
else 
{ 
    $thumb_width = $width; 
    $thumb_height = $height; 
} 
+0

Eh bien, je ne peux pas faire des images de x.xxx pixels. – Navarr

+0

En fait, le problème n'est pas le nombre renvoyé. Faire le calcul à la main c'est toujours calculer la taille appropriée pour l'image. Juste ne pas redimensionner l'image correctement. – Navarr

Questions connexes