Fonction de redimensionnement d'image (+ sauvegarde si besoin est), un peu plus performante que la derniere :) Je compte encore l'optimiser par la suite mais la c'est deja pas mal je pense, elle retravaille l'image et elle le fait bien donc pas de soucis =)
Source / Exemple :
<?php
function mini ($xmax,$ymax,$dossier,$img,$name,$fond_couleur) {
/*
$xmax => largeur maximale de l'image
$ymax => hauteur maximale de l'image
=> soit une taille en px soit 'none' pour dire qu'on veut garder la même
$dossier => dossier dans lequel doit être créé la miniature : format dossier/ (ne pas oublier le / )
$img => l'image à miniaturiser
$name => le nom de l'image
$fond_couleur => couleur de fond de l'image au format hexadecimal RRR-VVV-BBB
// Types d'images utilisés pour le 'switch' un peu plus loin
define('FORMAT_GIF',1);
define('FORMAT_JPEG',2);
define('FORMAT_PNG',3);
// dimensions critiques
define('XMIN',0);
define('YMAX',1000);
define('XMIN',0);
define('XMAX',1000);
// dimensions par défaut
define('DEFAUTX',150);
define('DEFAUTY',150);
// on essaie d'ouvrir le fichier uniquement en lecture (pour être sur qu'il existe) :
if(@$file=fopen($img,'r')) {
// si le fichier a bien été ouvert, on verifie que c'est bien une image
// getimagesize renvoie plusieurs infos de l'image (dimensions, type etc...) et FALSE
// si le fichier n'est pas une image :
if(list($largeur,$hauteur,$extention) = @getimagesize(htmlentities($img))) {
// si c'est bien une image, on teste les valeurs voulues pour la miniature
// largeur
if((isset($xmax) && !empty($xmax) && $xmax>XMIN && $xmax<XMAX)) {
$xm=$xmax;
} elseif($xmax=='none') {
// si la largeur n'est pas definie on garde la même
$xm=$largeur;
} else {
$xm=DEFAUTX; // largeur par defaut (au cas ou)
}
// hauteur
if((isset($ymax) && !empty($ymax) && $ymax>YMIN && $ymax<YMAX)) {
$ym=$ymax;
} elseif($ymax=='none') {
// si la hauteur n'est pas definie on garde la même
$ym=$hauteur;
} else {
$ym=DEFAUTY; // largeur par defaut (au cas ou)
}
// creation de la miniature :
// test de l'extention :
if(in_array($extention,array(1,2,3))) {
// si l'extention est bonne on continue
switch($extention) {
case FORMAT_GIF: // GIF
$im=imagecreatefromgif($img) or die('probleme de librairie');
break;
case FORMAT_JPEG: //JPEG
$im=imagecreatefromjpeg($img) or die('probleme de librairie');
break;
case FORMAT_PNG: // PNG
$im=imagecreatefrompng($img) or die('probleme de librairie');
break;
}
// test des dimensions :
// si l'image est trop large ou trop haute
if($largeur>$xm || $hauteur>$ym) {
// coeficient de proportionnalité (pour garder les proportions dans la reduction de l'image)
// la reduction ne se fait que pour des dimensions finales entieres donc on arrondis le resultat
if ($largeur && ($largeur > $hauteur)) {
// image plus large que haute
$nhauteur = ceil(($hauteur * $xm)/$largeur);
$nlargeur=$xm;
} else {
// image plus haute que large
$nlargeur = ceil(($largeur *$ym)/$hauteur);
$nhauteur=$ym;
}
} elseif($largeur<$xm || $hauteur<$ym) {
if($largeur<=$xm) {
$nlargeur=$largeur;
$xm=$largeur;
}
if($hauteur<=$ym) {
$nhauteur=$hauteur;
$ym=$hauteur;
}
} else {
$nlargeur=$largeur;
$nhauteur=$hauteur;
}
// calcul de la position de l'image sur la miniature (centrée si l'image finale est plus grande)
$py=($ym-$nhauteur)/2;
$px=($xm-$nlargeur)/2;
// miniaturisation
// image sur fond de couleur definie par l'utilisateur :
if(isset($fond_couleur) && !empty($fond_couleur)) {
$src=imagecreatetruecolor($xm,$ym) or die('probleme de librairie');
list($fond_rouge,$fond_vert,$fond_bleu) = explode('-',$fond_couleur);
$fond=imagecolorallocate($src,$fond_rouge,$fond_vert,$fond_bleu) or die('probleme de librairie');
// on dessine un rectangle de la couleur choisit par l'utilisateur (couleur de fond)
imagefilledrectangle($src,0,0,$xm,$ym,$fond) or die('probleme de librairie');
// on créé la miniature
imagecopyresampled($src,$im,$px,$py,0,0,$nlargeur,$nhauteur,$largeur,$hauteur) or die('probleme de librairie');
} else {
// Aucune couleur de fond definie!
return false;
}
} else {
//L'image doit être au format GIF, JPEG ou PNG !
return false;
}
} else {
// Le fichier n'est pas une image !
return false;
}
} else {
return false;
}
// dans le cas ou vous voudriez sauvegarder puis afficher, ne pas inverser cet ordre !
// sauvegarde de l'image :
imagepng($src,$dosier.$name.'.png');
// affichage de l'image
header('content-type: image/png');
return @imagepng($src);
}
?>
Conclusion :
Rien à ajouter pour l'instant, comme je l'ai dit je vais la modifier par la suite pour par exemple ne pas ecrase une image deja existante au cas ou, on verra par la suite :)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.