Miniature des images vectorielles

This commit is contained in:
Fred Tempez 2025-01-24 18:01:38 +01:00
parent 9aa2536d89
commit a5b00b32b9

View File

@ -1243,66 +1243,94 @@ class common
} }
/* /**
* Création d'une miniature * Crée une miniature à partir d'une image source.
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10 * Cette fonction prend en charge les formats raster (JPEG, PNG, GIF, WebP, AVIF) et vectoriels (SVG).
* @param string $src image source * Pour les images vectorielles (SVG), aucune redimension n'est effectuée : une copie est réalisée.
* @param string $dets image destination *
* @param integer $desired_width largeur demandée * @param string $src Chemin de l'image source.
*/ * @param string $dest Chemin de l'image destination (avec le nom du fichier et l'extension).
function makeThumb($src, $dest, $desired_width) * @param int $desired_width Largeur demandée pour la miniature (ignorée pour les SVG).
{ * @return bool True si l'opération a réussi, false sinon.
// Vérifier l'existence du dossier de destination. */
$fileInfo = pathinfo($dest); function makeThumb($src, $dest, $desired_width)
if (!is_dir($fileInfo['dirname'])) { {
mkdir($fileInfo['dirname'], 0755, true); // Vérifier l'existence du dossier de destination.
} $fileInfo = pathinfo($dest);
$source_image = ''; if (!is_dir($fileInfo['dirname'])) {
// Type d'image mkdir($fileInfo['dirname'], 0755, true);
switch ($fileInfo['extension']) { }
case 'jpeg':
case 'jpg': $extension = strtolower($fileInfo['extension']);
$source_image = imagecreatefromjpeg($src); $mime_type = mime_content_type($src);
break;
case 'png': // Gestion des fichiers SVG (copie simple sans redimensionnement)
$source_image = imagecreatefrompng($src); if ($extension === 'svg' || $mime_type === 'image/svg+xml') {
break; return copy($src, $dest);
case 'gif': }
$source_image = imagecreatefromgif($src);
break; // Chargement de l'image source selon le type
case 'webp': $source_image = '';
$source_image = imagecreatefromwebp($src); switch ($extension) {
break; case 'jpeg':
case 'avif': case 'jpg':
$source_image = imagecreatefromavif($src); $source_image = imagecreatefromjpeg($src);
} break;
// Image valide case 'png':
if (is_object($source_image)) { $source_image = imagecreatefrompng($src);
$width = imagesx($source_image); break;
$height = imagesy($source_image); case 'gif':
/* find the "desired height" of this thumbnail, relative to the desired width */ $source_image = imagecreatefromgif($src);
$desired_height = floor($height * ($desired_width / $width)); break;
/* create a new, "virtual" image */ case 'webp':
$virtual_image = imagecreatetruecolor($desired_width, $desired_height); $source_image = imagecreatefromwebp($src);
/* copy source image at a resized size */ break;
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height); case 'avif':
switch (mime_content_type($src)) { if (function_exists('imagecreatefromavif')) {
case 'image/jpeg': $source_image = imagecreatefromavif($src);
case 'image/jpg': } else {
return (imagejpeg($virtual_image, $dest)); return false; // AVIF non supporté
case 'image/png': }
return (imagepng($virtual_image, $dest)); break;
case 'image/gif': default:
return (imagegif($virtual_image, $dest)); return false; // Format non pris en charge
case 'image/webp': }
return (imagewebp($virtual_image, $dest));
case 'image/avif': // Image valide (formats raster uniquement)
return (imageavif($virtual_image, $dest)); if (is_resource($source_image) || (is_object($source_image) && $source_image instanceof GdImage)) {
} $width = imagesx($source_image);
} else { $height = imagesy($source_image);
return (false);
} // Calcul de la hauteur proportionnelle à la largeur demandée
} $desired_height = floor($height * ($desired_width / $width));
// Création d'une nouvelle image virtuelle redimensionnée
$virtual_image = imagecreatetruecolor($desired_width, $desired_height);
// Copie de l'image source dans l'image virtuelle avec redimensionnement
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);
// Enregistrement de l'image redimensionnée au format approprié
switch ($mime_type) {
case 'image/jpeg':
case 'image/jpg':
return imagejpeg($virtual_image, $dest);
case 'image/png':
return imagepng($virtual_image, $dest);
case 'image/gif':
return imagegif($virtual_image, $dest);
case 'image/webp':
return imagewebp($virtual_image, $dest);
case 'image/avif':
if (function_exists('imageavif')) {
return imageavif($virtual_image, $dest);
}
}
}
return false; // En cas d'échec
}
/** /**