Aller au contenu

Limite taille d'image source pour GD ?


cktoon

Sujets conseillés

Bonjour à tous,

pour un site sur lequel une partie administration permet d'envoyer une image -> qui est ensuite redimensionnée à la bonne taille, je viens de découvrir que selon la taille de l'image source, la procédure ne se fait plus.

Voici ma fonction de création d'image redimensionnée :

function reduire_largeur($image,$larg_max) {
$dim=getimagesize($image); // dim d'origine
if($dim[0]>$larg_max) { // Si besoin, on réduit
// Calculs taille de la nouvelle image
$reduc=$larg_max/$dim[0];
$coef_l=$larg_max;
$coef_h=ceil($dim[1]*$reduc);
// création de l'image réduite
$chemin = imagecreatefromjpeg($image);
$nouvelle = imagecreatetruecolor ($coef_l, $coef_h);
$copy = imagecopyresampled($nouvelle,$chemin,0,0,0,0,$coef_l,$coef_h,$dim[0],$dim[1]);
imagejpeg($nouvelle,$image);
imagedestroy ($chemin);
}
}

Si l'image d'origine dépasse 1708 pixels de large (je ne sais pas bien s'il s'agit uniquement de la taille de la largeur ou du nombre de pixels de l'image, j'ai fait mes tests avec la même image en déterminant cette limite), non seulement l'image n'est pas réduite, mais elle n'est pas non plus "lisible" par les pages qui tentent de l'afficher : elle est bien dans le dossier contenant mes images, mais si je teste son existence avec is_file, elle n'est pas considérée comme existante.

Bref, ce phénomène étrange n'est pas celui qui m'interroge fondamentalement, mais je me demandais si une limite existait au traitement de réduction d'image avec la librairie GD.

J'ai essayer de trouver des infos, apparemment, SPIP a une variable nommée MAX_SIZE_GD qui empêche l'envoi d'images trop grandes comme illustration d'articles. Mais je n'ai pas réussi à savoir si cette variable était liée à une valeur d'image source limite déterminée par la fonction php / la librairie GD ou s'il s'agit juste d'une limite mise de façon empirique....

Est-ce que quelqu'un a des infos à ce sujet (pas sur SPIP hein, je ne l'utilise pas ;) ) ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Le redimensionnement d'image par GD est très très gourmand en ressource. L'erreur la plus souvent renvoyé est lorsque le fichier est trop gros car GD traite les images JPEG en BMP.

Pour ce qui est de l'upload des images, elle n'est pas complète ce qui fait que l'image est à moitiée présente sur le serveur. En général, il y a une partie grise présente sur la photo.

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Salut,

j'ai bien tenté de voir s'il y avait une erreur : rien ne m'est renvoyé de particulier dans le cas où le truc qui coince... coince.

S'il s'agit d'un problème de ressources, y a-t-il un moyen de connaître ses limites ? Ce n'est peut être pas possible... mais sait-on jamais...

Lien vers le commentaire
Partager sur d’autres sites

Salut Dan,

voici l'image utilisée pour mes tests :

a3j002pom1.th.jpg

Attention, elle est assez lourde (500ko), et grande (plus de 2000 pixels de large)

Je l'ai utilisée pour mes tests en la redimensionant avec photoshop (enregistrement pour le web en jpg non progressif) jusqu'à 1700 pixels de large où j'ai constaté qu'à ce stade le redimensionnement marchait bien...

Merci de tes lumières :cool:

Lien vers le commentaire
Partager sur d’autres sites

Je viens de faire un essai pour réduire cette image, et cela marche très bien de mon côté...

Voici le code que j'ai utilisé, il est peut-être un peu plus complexe que le tien, mais je l'ai extrait tel quel de mon site immobilier en ne retirant que les écritures dans la base et la création des répertoires de stockage et les corrections du nom pour les caractères non ANSI... ;)

if ($action == "upload")
{
if (isset($binFile) && $binFile != "none" && ($binFile_type == "image/pjpeg" || $binFile_type == "image/jpeg") && filesize($binFile) < $max_prop_upload) // $max_prop_upload = maximum size for image
{
$data = fread(fopen($binFile, "rb"), filesize($binFile));
$fullname=$basepictdir."/".$binFile_name;

$inputImg = ImageCreateFromJPEG($binFile);
$srcX = imagesx($inputImg);
$srcY = imagesy($inputImg);

//Build the image
$maxY = 300; // fixed Y for the image. always the same
$maxX = 360; // max X for image, if image is smaller it will be stretched
$ratio = ($srcY / $maxY);
$dstX = ($srcX / $ratio);
$dstY = $maxY;
// the following test causes the image to be cropped, if needed
if ($dstX < $maxX) {
$dstY=($dstY * $maxX)/$dstX;
$dstX = $maxX;
}

$newimage = ImageCreateTrueColor($maxX, $maxY);
imagecopyresampled($newimage, $inputImg, (($maxX - $dstX) / 2),(($maxY - $dstY) / 2),0,0, $dstX+1, $dstY+1, $srcX, $srcY);
imageJPEG($newimage, "$full_name",75);
}
else
{
if (($binFile_type != "image/pjpeg") && ($binFile_type != "image/jpeg"))
print "<script language=\"javascript\" type=\"text/javascript\">alert('Image pas au format jpeg');</script>";
else {
if (filesize($binFile) > $max_prop_upload)
print "<script language=\"javascript\" type=\"text/javascript\">alert('Image trop volumineuse');</script>";
}
}
}

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Le redimensionnement d'image par GD est très très gourmand en ressource. L'erreur la plus souvent renvoyé est lorsque le fichier est trop gros car GD traite les images JPEG en BMP.

D'ailleurs en parlant de ca, je me suis rendu compte qu'Apache ne rendait pas systematiquement la memoire allouee et ne la reutilisait pas forcement lors d'une nouvelle requette.

Bref, on se retrouve ensuite avec des processes HTTP qui utilisent plusieurs centaines de Mo de memoire :thumbsdown:

Avec apache 1.3. il etait possible de tuer un fils apache depuis PHP ... mais je n'ai pas trouve l'equivalent en 2.0 ni en 2.2.

J'ai donc reduit le nombre de requestByChild, mais n'y a-t-il pas une meilleur solution ?

Lolo

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...

Retour de test : même problème chez moi....

Peux-tu me dire à quoi sert cette ligne de code dans ton script ?

$data = fread(fopen($binFile, "rb"), filesize($binFile));

Aurais-je une limitation quelque part (chez l'hébergeur ??) qui m'envoit paître avec ma fonction qui prendrait trop de ressources ?

Si au moins j'avais la possibilité de savoir ce qui coince, ça m'avancerait :(

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...