Skip to content
Extraits de code Groupes Projets
Valider 9e2350cb rédigé par cerdic's avatar cerdic
Parcourir les fichiers

#146 : pour eviter le plantage sur un calcul de vignette avec GD2 et une...

#146 : pour eviter le plantage sur un calcul de vignette avec GD2 et une limite memoire trop basse par rapport a la taille de l'image : 
- on teste la quantite de memoire disponible si la fonction memory_get_usage est disponible
- on compare le nombre de pixels de l'image source par rapport a la constante _IMG_GD_MAX_PIXELS qui permet de configurer manuellement une limite a la taille des images dont une vignette est calculee
Si le calcul de vignette n'est pas possible, on ne renvoi rien (image source resizee cote client)
parent 829d0d9b
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -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);
}
}
......
......@@ -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',
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter