Fonction php qui créé depuis un dossier d'images des miniatures carrées de ces images.
Comme souvent, je me suis inspiré de bouts de code trouvés ici et là. Donc forcément y a des morceaux qui ne sont pas de moi, mais que j'ai modifiés à ma sauce. Après, pour la création d'images en php, il n'y a pas 50 façons de faire, c'est partout pareil.
- Les miniatures seront créées dans le dossier d'origine des images.
- Format des miniatures : _99x99 sera ajouté au nom de l'image (99 étant la dimension choisie dans le code pour les miniatures).
- Extension des images : png ou jpg.
- La miniature aura la même extension que l'image d'origine.
Il suffit de renseigner dans le code le dossier à traiter et la dimension voulue pour les miniatures et ensuite de l'exécuter.
Si des miniatures de la dimension choisie existent déjà, les nouvelles miniatures écraseront les anciennes.
Le code
<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Création miniatures</title>
<head>
<body>
<?php
// constantes
define('_NW_ROOT_', $_SERVER['DOCUMENT_ROOT']);
define('PATH_FOLDER_IMAGES', _NW_ROOT_.'/images/');
define('URL_FOLDER_IMAGES', '../../images/');
define('FORMAT_THUMBNAIL', '_%sx%s');
define('THUMBNAIL_SIZE', [32, 48, 70, 100]); // tailles miniature autorisées
// *****
/*
test(PATH_FOLDER_IMAGES, 't=PATH_FOLDER_IMAGES&l='.basename(__FILE__).':'.__LINE__.' ');
test(URL_FOLDER_IMAGES, 't=URL_FOLDER_IMAGES&l='.basename(__FILE__).':'.__LINE__.' ');
test(FORMAT_THUMBNAIL, 't=FORMAT_THUMBNAIL&l='.basename(__FILE__).':'.__LINE__.' ');
test(implode(', ', THUMBNAIL_SIZE), 't=THUMBNAIL_SIZE&l='.basename(__FILE__).':'.__LINE__.' ');
*/
// ###################################################
$img_ext = ['jpg', 'png']; // seules possibles pour l'instant
$folder = 'les-images-a-toto'; // dossier d'images
$dim = 100; // taille de miniatures désirée -> les miniatures seront de la forme : images_100x100.ext
$pos = 'center'; // les miniatures seront crées à partir du milieu des images
// ###################################################
/**
* Permet de créer une miniature carrée d'une image de forme quelconque.
* $src : désigne le nom de l'image source
* $dest : désigne le nom de la minature
* $largeur : désigne la largeur du carré de la miniature
* $pos : peut prendre les valeurs suivante :
* "left", "right" (si la photo est horizontale)
* "bottom","top" (si la photo est verticale)
* ou n'importe quelle autre valeur pour le milieu.
*/
// les erreurs fatales :-)
if (!file_exists(PATH_FOLDER_IMAGES.$folder)) {
echo 'Le dossier <strong>'.$folder.'</strong> n\'existe pas.';
die ('</body></html>');
}
if (!in_array($dim, THUMBNAIL_SIZE)) {
echo 'La taille de miniature <strong>'.$dim.'</strong> n\'est pas autorisée.<br>Tailles admises : <strong>'.implode(', ', THUMBNAIL_SIZE).'</strong>.';
die ('</body></html>');
}
/**
* parcourt un dossier $f
* retourne un tableau contenant les fichiers avec l'extension contenue dans le tableau $e
* nombre d'images à afficher $n
*/
function searchExtFolder($f, $e, $n = '') {
$tbl_ext = array();
$cpt = 0;
if ($handle = opendir($f)) {
while ((false !== ($file = readdir($handle))) && ($cpt != $n || $n == '')) {
// no . nor ..
if ($file != '.' && $file != '..') {
foreach ($e as $ex) {
if (preg_match("/.".$ex."/i",$file)) {
if (!is_dir($f.'/'.$file)) {
$tbl_ext[] = $file;
$cpt++;
} // end if (!is_dir($f.'/'.$file))
} // end if (preg_match("/.".$ex."/i",$file))
} // end foreach ($e as $ex)
} // end if ($file != '.' && $file != '..')
} // end while
closedir($handle);
}
return $tbl_ext;
}
function thumbnailCreate($src, $dest, $largeur, $pos) {
list($srcX, $srcY, $type, $attr) = getimagesize($src);
// ######################################
// test($type, 't=$type&l='.basename(__FILE__).':'.__LINE__.' ');
switch ($type) {
case 2:
$imgSrc = imagecreatefromjpeg($src);
break;
case 3:
$imgSrc = imagecreatefrompng($src);
break;
}
// ######################################
if (empty($imgSrc)) {
return false;
}
if ($srcX >= $srcY) {
$dim = $srcY;
$horizontale = true;
}
elseif ($srcX <= $srcY){
$dim = $srcX;
$verticale = true;
}
else {
$dim = $srcX;
}
// on determine le point de depart x, y
if (isset($horizontale) && $horizontale) {
switch ($pos) {
case "left":
$point_x_ref = "0";
$point_y_ref = "0";
break;
case "right":
$point_x_ref = ($srcX) - ($dim);
$point_y_ref = "0";
break;
default:
$point_x_ref = ($srcX / 2) - ($dim / 2);
$point_y_ref = "0";
break;
}
}
elseif ($verticale) {
switch($pos){
case "top":
$point_x_ref = "0";
$point_y_ref = "0";
break;
case "bottom":
$point_x_ref = "0";
$point_y_ref = ($srcY) - ($dim);
break;
default:
$point_x_ref = "0";
$point_y_ref = ($srcY / 2) - ($dim / 2);
break;
}
}
$imDest = imagecreatetruecolor($largeur, $largeur);
// *****
if ($type == 3) {
// conserver la transparence si png
$background = imagecolorallocate($imDest , 0, 0, 0);
imagecolortransparent($imDest, $background);
imagealphablending($imDest, false);
imagesavealpha($imDest, true);
}
// *****
imagecopyresampled($imDest,
$imgSrc,
0,
0,
$point_x_ref,
$point_y_ref,
$largeur,
$largeur,
$dim,
$dim);
imagedestroy($imgSrc);
// ######################################
switch ($type) {
case 2:
imagejpeg($imDest, $dest, 100);
break;
case 3:
imagepng($imDest, $dest, 9);
break;
}
// ######################################
imagedestroy($imDest);
return true;
} // end function thumbnailCreate
$tbl_img_before = searchExtFolder(PATH_FOLDER_IMAGES.$folder.'/', $img_ext);
// test($tbl_img_before, 't=$tbl_img_before&l='.basename(__FILE__).':'.__LINE__.' ');
$tbl_img_after = array_flip($tbl_img_before);
// test($tbl_img_after, 't=$tbl_img_after apres array_flip&l='.basename(__FILE__).':'.__LINE__.' ');
// Eviter les miniatures de miniatures
// Une miniature image_70x70_100x100.jpg ne doit pas être générée à partir de image_70x70.jpg (qui est déjà une miniature)
foreach (THUMBNAIL_SIZE as $toto) {
$small = sprintf(FORMAT_THUMBNAIL, $toto, $toto);
foreach ($tbl_img_before as $iii) {
if (strpos($iii, $small) !== false) {
// echo $iii. ' contient '.$small.'<br>';
unset($tbl_img_after[$iii]);
}
}
}
// test($tbl_img_after, 't=$tbl_img_after&l='.basename(__FILE__).':'.__LINE__.' ');
$tbl_img_after = array_flip($tbl_img_after);
// test($tbl_img_after, 't=$tbl_img_after&l='.basename(__FILE__).':'.__LINE__.' ');
$cpt = 0;
$sss = sprintf(FORMAT_THUMBNAIL, $dim, $dim);
// On parcourt le tableau des images pour créer les miniatures correspondantes
foreach ($tbl_img_after as $img) {
$cpt++;
$original = PATH_FOLDER_IMAGES.$folder.'/'.$img;
$nom = pathinfo($img, PATHINFO_FILENAME);
$ext = pathinfo($img, PATHINFO_EXTENSION);
// *****
$dest = PATH_FOLDER_IMAGES.$folder.'/'.$nom.$sss.'.'.$ext;
// *****
// test($ext, 't=$ext&l='.basename(__FILE__).':'.__LINE__.' ');
// test($dest, 't=$dest&l='.basename(__FILE__).':'.__LINE__.' ');
// *****
thumbnailCreate($original, $dest, $dim, $pos);
// *****
echo '<strong>'.$img.'</strong> : Création miniature <strong>'.$nom.$sss.'.'.$ext.'</strong> terminée<br>'."\n";
echo '<img src="'.URL_FOLDER_IMAGES.$folder.'/'.$nom.$sss.'.'.$ext.'">'."\n";
echo '<hr>';
}
echo "<big>***** Opération terminée : <strong>$cpt</strong> miniature(s) créé(e)s. *****</big>";
echo '</body></html>';
?>
Le résultat de la fonction en image
Dans le dossier...
Visualisation d'un dossier avec des miniatures de format 70 et 100.
Source : https://www.nonoweb.net/creation-en-php-d-images-miniatures-carrees
Laisser un commentaire (Seuls le nom et le commentaire sont requis).
Les commentaires sont modérés avant publication.