2009-04-17 10 views
0

Je travaille sur une construction d'une galerie et le but est une barrière d'entrée basse. Mon utilisateur est une personne qui prend des photos en utilisant son appareil photo numérique afin que la taille du fichier soit comprise entre 200 et 400 Ko par image. Le problème que je rencontre dans l'utilisation de la bibliothèque GD est que chaque image redimensionnée et téléchargée utilise environ 90 Mo de mémoire + lorsque le serveur a une limite de 64 Mo. Lorsque j'utilise ImageMagick, il expire et déclenche une erreur interne du serveur.Comment télécharger/redimensionner des images prises avec un appareil photo numérique?

Je me demande si quelqu'un a de l'expérience avec le téléchargement/redimensionnement de ces grandes tailles d'image et pourrait me donner quelques indications.

Merci,
Levi

modifier: Voici mon code pour télécharger

 /** Begin Multiple Image Upload**/  
     $numberImages = count($_FILES['galFile']['name'])-1; 

for($i=1;$i<=$numberImages;$i++) 
{ 
$imageName = $_FILES['galFile']['name'][$i]; 
      $imageType = $_FILES['galFile']['type'][$i]; 
      $imageSize = $_FILES['galFile']['size'][$i]; 
      $imageTemp = $_FILES['galFile']['tmp_name'][$i]; 
      $imageError = $_FILES['galFile']['error'][$i]; 

      //Make sure it is an image 
      if(in_array(end(explode(".", $imageName)), $allowed)) 
      { 
       //Where to upload image to 
       $uploadFile = $uploadDir . $imageName; 
       if (file_exists($uploadFile)) 
     { 
      //What to do if file already exists 
      //Append random number to the end 
      $front = explode(".", $imageName); 
      $randomNum = rand(1,100); 
      $front[0] = $front[0].$randomNum; 
      $imageName = $front[0].".".$front[1]; 
      $uploadFile = $uploadDir . $imageName; 
     } 
        if(move_uploaded_file($imageTemp,$uploadFile)) 
        { 
        //Add $imageName to DB 
        $query = "INSERT INTO galleryImages VALUES(\"0\",\"$lastInsert\",\"$imageName\",\"$i\")"; 
       mysql_query($query); 
       reSizePic($uploadFile); 
        } 
      } 
} 

Voici le code GD j'avais utilisé pour redimensionner:

function reSizePic($image) 
{ 
$source_pic = $image; 
$destination_pic = $image; 
$max_width = 660; 
$max_height = 500; 

$src = imagecreatefromjpeg($source_pic); 
list($width,$height)=getimagesize($source_pic); 

$x_ratio = $max_width/$width; 
$y_ratio = $max_height/$height; 

if(($width <= $max_width) && ($height <= $max_height)) 
{ 
    $tn_width = $width; 
    $tn_height = $height; 
} 
elseif (($x_ratio * $height) < $max_height) 
{ 
    $tn_height = ceil($x_ratio * $height); 
    $tn_width = $max_width; 
} 
else 
{ 
    $tn_width = ceil($y_ratio * $width); 
    $tn_height = $max_height; 
} 

$tmp = imagecreatetruecolor($tn_width,$tn_height); 

imagecopyresampled($tmp,$src,0,0,0,0,$tn_width, $tn_height,$width,$height); 

imagejpeg($tmp,$destination_pic,100); 
imagedestroy($src); 
imagedestroy($tmp); 
} 

Et cela est le code ImageMagick que j'utilise pour redimensionner:

$resource = NewMagickWand(); 
MagickReadImage($resource,$image); 
MagickSetImageCompressionQuality($resource, 100); 
$resource = MagickTransformImage($resource,'0x0','660x500'); 
MagickWriteImage($resource, $image); 
DestroyMagickWand($resource); 
+0

Vous faites probablement quelque chose d'inefficace car ImageMagick devrait être capable de gérer des images de 400ko sans problème. Combien essayez-vous de redimensionner à la fois? Pouvez-vous envoyer votre code? –

+0

Je suppose que vous ouvrez un fichier mais ne le ferme pas ou quelque chose pour obtenir autant d'utilisation de la mémoire. Publiez votre code peut-être? – Anthony

+0

Je ne compterais pas trop sur 200-400KB - les caméras de 3,2 à 5 mégapixels sont courantes ces jours-ci. – Blorgbeard

Répondre

2

http://pl.php.net/imagecreatefromjpeg

The memory required to load an image using imagecreatefromjpeg() is a function of the image's dimensions and the images's bit depth, multipled by an overhead. It can calculated from this formula: Num bytes = Width * Height * Bytes per pixel * Overhead fudge factor Where Bytes per pixel = Bit depth/8, or Bits per channel * Num channels/8.

C'est au sujet de la partie GD. Maintenant, le ImageMagick: avez-vous essayé une approche plus simple:

$thumb = new Imagick('image.jpg'); 
$thumb->resizeImage($w,$h,Imagick::FILTER_LANCZOS,1); 
$thumb->writeImage('thumb.jpg'); 
$thumb->destroy(); 
+0

Ce qui précède pour ImageMagick ne fonctionnait pas. Il dit, "Erreur fatale: Class 'Imagick' pas trouvé" J'utilise Hostgator et ils ont installé Magickwand, savez-vous si cela signifie que je ne peux utiliser que les commandes Magickwand? – Levi

+0

A pris cet exemple à partir des commentaires de docs, si vous avez installé le paquet magick, il devrait fonctionner, je pense. – zalew

+0

Le code que j'ai a redimensionné les images pour les 15 premières images téléchargées. Si je télécharge plus de 15, ça ne se termine pas, donc je crois que c'est quelque chose à voir avec le serveur et une sorte de timeout. – Levi

1

Veuillez placer le code suivant en haut de votre fichier php.

ini_set ("memory_limit", "500M");