diff --git a/ecrire/inc/logos.php b/ecrire/inc/logos.php index 898e52b93df4078a6b953bde5ac17612c64fba3a..24eda7b40118472e73eeb4e98b4d539c99868a52 100644 --- a/ecrire/inc/logos.php +++ b/ecrire/inc/logos.php @@ -306,21 +306,11 @@ function creer_vignette($image, $maxWidth, $maxHeight, $format, $destdir, $destf } // gd ou gd2 else if ($process == 'gd1' OR $process == 'gd2') { - - // Recuperer l'image d'origine - if ($format == "jpg") { - $srcImage = @ImageCreateFromJPEG($image); - } - else if ($format == "gif"){ - $srcImage = @ImageCreateFromGIF($image); - } - else if ($format == "png"){ - $srcImage = @ImageCreateFromPNG($image); - } - if (!$srcImage) { - spip_log("echec gd1/gd2"); + if (_IMG_GD_MAX_PIXELS && $srcWidth*$srcHeight>_IMG_GD_MAX_PIXELS){ + spip_log("vignette gd1/gd2 impossible : ".$srcWidth*$srcHeight."pixels"); return; } + // Choisir le format destination // - on sauve de preference en JPEG (meilleure compression) // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire @@ -340,31 +330,57 @@ function creer_vignette($image, $maxWidth, $maxHeight, $format, $destdir, $destf return; } - // Initialisation de l'image destination - if ($process == 'gd2' AND $destFormat != "gif") - $destImage = ImageCreateTrueColor($destWidth, $destHeight); - if (!$destImage) - $destImage = ImageCreate($destWidth, $destHeight); - - // Recopie de l'image d'origine avec adaptation de la taille - $ok = false; - if (($process == 'gd2') AND function_exists('ImageCopyResampled')) { - if ($format == "gif") { - // Si un GIF est transparent, - // fabriquer un PNG transparent - $transp = imagecolortransparent($srcImage); - if ($transp > 0) $destFormat = "png"; + $memoryNeeded = round(($srcsize[0] * $srcsize[1] * $srcsize['bits'] * $srcsize['channels'] / 8 + 65536) * 1.65); + #spip_log("GD : memory need $memoryNeeded"); + #if (function_exists('memory_get_usage')) + #spip_log("GD : memory usage ".memory_get_usage()); + #spip_log("GD : memory_limit ".ini_get('memory_limit')); + if (function_exists('memory_get_usage') && memory_get_usage() + $memoryNeeded > (integer) ini_get('memory_limit') * 1048576){ + spip_log("vignette gd1/gd2 impossible : memoire insuffisante $memoryNeeded necessaire"); + return; + } + else{ + // Recuperer l'image d'origine + if ($format == "jpg") { + $srcImage = @ImageCreateFromJPEG($image); + } + else if ($format == "gif"){ + $srcImage = @ImageCreateFromGIF($image); } - if ($destFormat == "png") { - // Conserver la transparence - if (function_exists("imageAntiAlias")) imageAntiAlias($destImage,true); - @imagealphablending($destImage, false); - @imagesavealpha($destImage,true); + else if ($format == "png"){ + $srcImage = @ImageCreateFromPNG($image); + } + if (!$srcImage) { + spip_log("echec gd1/gd2"); + return; + } + + // Initialisation de l'image destination + if ($process == 'gd2' AND $destFormat != "gif") + $destImage = ImageCreateTrueColor($destWidth, $destHeight); + if (!$destImage) + $destImage = ImageCreate($destWidth, $destHeight); + + // Recopie de l'image d'origine avec adaptation de la taille + $ok = false; + if (($process == 'gd2') AND function_exists('ImageCopyResampled')) { + if ($format == "gif") { + // Si un GIF est transparent, + // fabriquer un PNG transparent + $transp = imagecolortransparent($srcImage); + if ($transp > 0) $destFormat = "png"; + } + if ($destFormat == "png") { + // Conserver la transparence + if (function_exists("imageAntiAlias")) imageAntiAlias($destImage,true); + @imagealphablending($destImage, false); + @imagesavealpha($destImage,true); + } + $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); } - $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); + if (!$ok) + $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); } - if (!$ok) - $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); // Sauvegarde de l'image destination $vignette = "$destination.$destFormat"; @@ -376,7 +392,8 @@ function creer_vignette($image, $maxWidth, $maxHeight, $format, $destdir, $destf else if ($destFormat == "png") ImagePNG($destImage, $vignette); - ImageDestroy($srcImage); + if ($srcImage) + ImageDestroy($srcImage); ImageDestroy($destImage); } } diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index dad75a741494d99d8428e1e34f2a57168651dbbb..10e28e129bc1ac60eab0888d1251f643d07a3b3a 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -883,6 +883,8 @@ function spip_initialisation() { define('_IMG_MAX_WIDTH', 0); # largeur en pixels define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels + define('_IMG_GD_MAX_PIXELS', 0); # nombre de pixels maxi pour calcul de la vignette avec gd + // Le fichier de connexion a la base de donnees define('_FILE_CONNECT_INS', (_DIR_RESTREINT . "inc_connect")); define('_FILE_CONNECT',