2013-02-25 3 views
0

J'ai écrit cette petite fonction pour générer des images miniatures d'une plus grande source jpg/jpeg/png, et fonctionne parfaitement sur les images jpg/jpeg en fonction de la taille de l'image png, va bloquer la fonction à un point indéterminé. Les petites images 300x200 fonctionnent, mais quelque chose comme 2880x1800 ne fonctionnera pas.PHP: Générer des images miniatures PNG à partir de la source PNG bloque la fonction basée sur la taille PNG

fonction Voici mon (annoté):

function make_thumb($filename, $destination, $desired_width) { 
    $extension = pathinfo($filename, PATHINFO_EXTENSION); 

    // Read source image 
    if ($extension == 'jpg' || $extension == 'jpeg') { 
     $source_image = imagecreatefromjpeg($filename); 
    } else if ($extension == 'png') { 
     $source_image = imagecreatefrompng($filename); // I think the crash occurs here. 
    } else { 
     return 'error'; 
    } 

    $width = imagesx($source_image); 
    $height = imagesy($source_image); 

    $img_ratio = floor($height/$width); 

    // Find the "desired height" of this thumbnail, relative to the desired width 
    $desired_height = floor($height * ($desired_width/$width)); 

    // Create a new "virtual" image 
    $virtual_image = imagecreatetruecolor($desired_width, $desired_height); 

    // Copy source image at a resized size 
    imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height); 

    // Create the physical thumbnail image to its destination 
    if ($extension == 'jpg' || $extension == 'jpeg') { 
     $source_image = imagejpeg($virtual_image, $destination); 
    } else if ($extension == 'png') { 
     $source_image = imagepng($virtual_image, $destination, 1); 
    } else { 
     return 'another error'; 
    } 
} 

La seule documentation que j'ai trouvé que mentionné me problèmes similaires était this. Est-ce mon problème? Des solutions? Pourquoi fait-il cela?

Répondre

1

Vous êtes probablement à court de mémoire. 2880 x 1800 dans la couleur vraie aura besoin d'environ 20 mégaoctets.

Vérifiez votre php.ini pour memory_limit.

1

Je suis un idiot. Cela ou PHP est vraiment mauvais pour gérer de grandes images PNG. Ce commentaire de la documentation PHP pour hereimagepng() dit:

My script was unable to complete: Fatal error: Allowed memory size of XX bytes exhausted (tried to allocate XX+n bytes).

I found out that PHP handles images in uncompressed format: my input image was [email protected] bit => ~150 MB per single in-memory copy.

As a solution, you can either check the dimensions and reject anything too big or, as I did, use ini_set('memory_limit','1024M'); on the page start (if your server has enough on board memory).

Alors, rappelez-vous d'augmenter votre limite de mémoire disponible à l'aide ini_set('memory_limit','1024M'); !!!