Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[ImageMagick] imagecreatefromjpeg limité à des photos de 2400 pixels


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    [ImageMagick] imagecreatefromjpeg limité à des photos de 2400 pixels
    Bonjour,

    J'utilise un script php pour redimensionner des photos et créer des avatars. J'ai utilisé plusieurs scripts différents et malgres tout, je n'arrive pas à redimensionner des images dont la taille dépasse les 2400 pixels quelle que soit le poid.
    Après quelques test, je m'aperçoit que le script s'arrete à "imagecreatefromjpeg".

    Y'a t'il un moyen de contourner le "imagecreatefromjpeg", cela provient-il de mon hébergment (1and1) ou est-ce un autre probleme ?

    Merci de m'avoir lu.

  2. #2
    Rédacteur

    Problème de mémoire, il faut savoir que PHP charge l'image en memoire et est limité par son memory_limit.

    tu peux utiliser ini_set('memory_limit'), pour augmenter la mémoire, si tu as accès à une telle fonction (et en général sur du mutualisé, tu n'as pas accès à de telles fonctions ).

    Tu peux trouver plus de renseignements, dans les commentaires de http://fr3.php.net/manual/fr/functio...tefromjpeg.php


  3. #3
    Futur Membre du Club
    Merci pour la réponse.

    Je viens de voir que mon memory limit est fixé à 40Mo. Cela ne suffit pas ?
    Mais ce que je ne comprends surtout pas c'est que si j'utilise la fonction ini_set('memory_limit'), ça veut dire que ça va me donner plus que 40Mo ?! Ca fait beaucoup pour une image de 3000 pixels de large !

    En tout cas merci bcp pour le lien.

  4. #4
    Candidat au Club
    Même problème
    Bonjour,

    Je suis également chez 1&1 et cela fait bientôt une semaine que je me heurte au même problème.

    En fait, je ne formulerais pas la contrainte par 2400 pixels mais par l'équation suivante :

    (Largeur * Hauteur)/(1024²) < 2,4

    Ne me demandez pas pourquoi, je n'en sais rien mais je l'ai établi après une centaine de tests.

    1&1 bloque le ini_set ainsi que l'instruction dans le .htaccess

    Si qq a une idée pour contourner, je suis preneur ! Quand on voit des sites comme pixmania qui joue avec les images facilement, il doit y avoir moyen...

    Merci d'avance.

  5. #5
    Futur Membre du Club
    Bonjour,

    J'ai recemment appelé le service technique 1and1 qui me fait bien rire puisque c'est une receptionniste qui tente, tant bien que mal, de me retranscrire les infos qu'elle va demander au vrai technicien à chacune de mes questions.
    Bref... là n'est pas le problème.

    On m'a simplement répondu que l'image d'origine + l'image redimensionnée ne devait pas dépasser les (valeur très approximatives m'ont-ils dit) 12 Millions de pixels.

    La solution dans notre cas étant de passer d'un hebergement mutualisé à un serveur dédié. Il n'y aurait aucun soucis, on pourrait toucher au memory_limit (d'ailleurs, Pixmania n'est certainement pas mutualisé =) ceci explique cela). Ce qui dans mon cas, me ferai passer de 0€ par mois (j'ai l'offre premium gratuite pendant 3 ans) à 60€ minimum par mois...

    En tout cas chapeau pour la formule ^^. Malgres tout, elle ne s'applique pas pour mon cas. J'arrive à redimenssionner des images qui font 2000 * 1500 pixels.

    Voila... Mais appel le service technique pour te marrer un coup =) Elles sont malgres tout très charmantes.

  6. #6
    Candidat au Club
    Je me doutais bien également que le serveur dédié était la solution...

    Tant pis ! Je suis par contre étonné que tu arrives à redimensionner une image de 2000 * 1500 pixels, étant moi-même en offre premium pour 2 ans encore.

    Tu as du JPG au départ ou un autre format ? Connais tu le type d'encodage (les miennes viennent d'un appareil photo numérique, en haute qualité et je crois que c'est du 24 bits couleurs).

  7. #7
    Futur Membre du Club
    Je saurais pas vraiment te dire le type d'encodage surtout que c'est une photo que j'ai du redimensionner avec photohop... Tout ce que je peux te dire c'est qu'elle fait 2Mo.

  8. #8
    Nouveau Candidat au Club
    Après quelques essais
    Bonjour tout le monde.

    Je suis hébergé sur 1and1 en pack perso confort et j'ai eu le même problème.
    Je viens de faire des tests avec des tas résolutions différentes et j'en arrive aux conclusions suivantes :
    Ca marche avec des résolutions inférieures ou égales à 1605*2139 (quelque soit le poids) mais plus avec des résolutions supérieures ou égales à 1605*2140.
    En gros, il faut pas se focaliser trop sur ces chiffres mais si l'image dépasse 3433095px environ, c'est mort

    Bon courage...

  9. #9
    Invité
    Invité(e)
    Bonjour,

    J'ai eu le même problème avec la fonction imagecreatefromjpeg() et j'ai pu contourner partiellement le problème en utilisant la fonction imagejpeg() de la manière suivante :

    $im = imagecreatetruecolor($src_width, $src_height);
    $img_src = imagejpeg($im, $chemin_vers_image_a_redimensionner);

    $img_dest = imagecreatetruecolor($dest_witdh, $dest_height);

    imagecopyresampled($img_dest, $img_src, 0, 0, 0, 0, $dest_width, $dest_height, $src_width, $src_height);

    Le script s'exécute correctement jusque la 3ème instruction mais rencontre le même problème lors du imagecopyresampled(...)

  10. #10
    Expert éminent
    Pour éviter de faire planter le script à cause d'un dépassement mémoire, j'avais trouvé ce script qui à l'air de fonctionner :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $infos = getimagesize($_FILES['photo']['tmp_name']);
    $width = $infos[0];
    $height = $infos[1];
    $bit = $infos['bits'];
    $channel = $infos['channels'];
    //en octets
    $m_used = memory_get_usage();
    //en Mo
    $mem_used = round($m_used / pow(1024,2),2).'M';			
    //calcul de mémoire utilisé pour le traitement de l'image
    $m_need = round(($width * $height * $bit * $channel / 8 + pow(2, 16)) * 1.65); 			
    //la memoire limite du server
    $m_limit = (integer) ini_get('memory_limit') * pow(1024, 2);			
    //la mémoire à allouer pour eviter la Fatal error
    $m_aloc = $m_need - $m_limit;
    $m_aloc += $m_used;//on ajoute la mémoire déjà utilisé
    //on convertit en Mo
    $memory = round($m_aloc / pow(1024,2),2);
    echo "<hr />taille: $width x $height px<br />nb de bits: $bit<br />canaux: $channel<hr /><br />";
    echo 'Memoire utilisé par le script : '.$mem_used;
    echo '<hr />Mémoire utilisée pour la redimension : '.round($m_need / pow(1024,2),2).'M ';
    echo '<hr />Mémoire possible : '.round($m_limit / pow(1024,2),2).'M<br />';
    echo "<hr />Manque de mémoire : $memory M<br />";

###raw>template_hook.ano_emploi###