Création en PHP d'images miniatures carrées

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.

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

thumbnail-creation-01

Dans le dossier...

Visualisation d'un dossier avec des miniatures de format 70 et 100.

thumbnail-creation-02

Laisser un commentaire (Seuls le nom et le commentaire sont requis).
Les commentaires sont modérés avant publication.

 
Sélection smileys