VIGNETTE EN RECADRANT AVEC TAILLE FIXE!

Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
- - Dernière réponse : sabiha93
Messages postés
33
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
5 août 2010
- 26 août 2010 à 14:30
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/50269-vignette-en-recadrant-avec-taille-fixe

sabiha93
Messages postés
33
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
5 août 2010
-
Salut!
C'est exactement ce que je cherchais, et comme je suis pas assez douée en PHP pour le faire toute seule :p
En tout cas merci pour ce script court et très efficace :)
leymiris
Messages postés
2
Date d'inscription
jeudi 8 décembre 2005
Statut
Membre
Dernière intervention
19 janvier 2010
-
Merci beaucoup pour ce script ! Après avoir perdu espoir dans la réalisation par mes soins j'ai passé un bout a chercher sur le net un script comme celui-ci ! Une bonne soirée (matinée) qui ce termine :)
cs_palarcon
Messages postés
8
Date d'inscription
dimanche 28 juin 2009
Statut
Membre
Dernière intervention
16 octobre 2009
-
Bonjour,

Merci pour cette fonction tres pratique.

Personnellement j'ai ajoute :
- un parametre pour demander la creation (ou non) de la miniature. (ce qui permet de decider ailleurs si la miniature
doit etre recree ou non).
- un petit test pour verifier si la miniature existe deja,
et pour ne pas la creer a chaque fois.

function vignette( $nomImage,
$largeur_dest = 140,
$hauteur_dest = 120,
$demande_creation = false)
{
$nomMiniature =
dirname($nomImage)."/_thb_".basename($nomImage);

// si le fichier miniature n'existe pas,
// ou si on demande a le cree, on genere la miniature
if( !file_exists($nomMiniature) or
$demande_creation == true )
{
// corps de la fonction inchange
// ...

// utilisation du nom de la miniature
imageanytype($imageFinale, $nomMiniature, 100);
}
return($nomMiniature);
}

Cordialement
Flachy Joe
Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
1 -
Salut,
il me semble qu'il y a une bourde là :
# return imagecreatefromgif($nomImage);
# $fctImage = imagegif;
# break;

Le return empêche l'exécution du reste donc $fctImage n'est pas défini et break ne sert à rien, dans les lignes du dessous non plus.

A+
webrunner
Messages postés
156
Date d'inscription
lundi 23 juin 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Merci pour ce script que je vais tester tantôt dans mon CMS et qui me permettra de ne plus imposer le même rapport longueur/largeur aux images que je veux "thumbifier".
GauldoMagique
Messages postés
8
Date d'inscription
lundi 15 décembre 2008
Statut
Membre
Dernière intervention
12 janvier 2009
-
Salut, oui j'ai eu fait une classe qui réagissait de la sorte, mais qui était plutôt tenté de récupérer l'image envoyer d'un formulaire et en créer une miniature.

L'idée du cache de Flashy Joe me plait beaucoup, mais sinon la création de miniature à la volée, c'est énormément lourd !

Enfin, voici la classe proposée : http://www.phpcs.com/codes/CLASSE-GENERATEUR-MINIATURE-STRICTE-OPTIMISE_48932.aspx

A+
masternico
Messages postés
494
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011
-
pardon, je n'avais pas compris
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
Je ne parlais pas de sauvegarde des images mais de la méthode de recadrage...
masternico
Messages postés
494
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011
-
Pas tant dommage en fait.

Le problème traité ici de devrait pas l'être.
Le script proposé permet une miniaturisation avec recadrage (Je n'ai pas regardé en profondeur car il en existe beaucoup d'autre semblable, chacun ayant sa petite particularité faisant défaut aux autres). Il serait déplacé de vouloir gérer le problème du stockage des miniatures dans ce script.

Et c'est d'ailleur pourquoi vous ne trouverez pas script de miniaturisation que le fasse.

C'est à chacun de faire la miniature puis d'utiliser un dossier de stockage pour les afficher plus rapidemment.

Jamais un script de miniaturisation ne doit s'occuper de gérer le stockage des miniatures. Tout simplement pour des raisons de portabilité.

Enfin, il aurait été plus utile de faire une classe objet du type:

class miniature
{
...
}

class stockage
{
...
}

class galerie
{
private image_liste;
private dossier_stockage;

public __construct()
{
$this->image_liste = array();
$dossier_stockage = new stockage();
}

public define_stockage_dir($directory)
{
$this->dossier_stockage->define_stockage_dir($directory);
}

public add_image_to_galerie($nom_image,$width_max,$height_max)
{
$image_temp = new miniature($nom_image);
$image_temp->create_vignette(75,50);
$this->image_liste[] = $image_temp;
$this->dossier_stockage->store_vignette($image_temp);
}

...
}

$my_galerie = new galerie();
$my_galerie->define_stockage_dir('/images/mini/');
$my_galerie->add_image_to_galerie('/temp/blabla.jpg',75,40);


foreach($my_galerie->image_liste as $index=>row_content)
{
echo 'image_dir . $row_content->image_name . '">

';
}
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
merci...
Dommage qu'il y ait trop de sources qui se ressemblent mais aucune qui gère le pb dont nous traitons ici...
@++
vincseize
Messages postés
114
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
28 mars 2010
-
et je te met une note, la moindre des choses
;)
masternico
Messages postés
494
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011
-
gilleswebmaster +1
vincseize
Messages postés
114
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
28 mars 2010
-
Dans tous les cas, effectivement bien pratique

merci les gars
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
Tu uploades ta grande image, ta vignette est générée dans un dossier temp/
et à chaque modif de la grande image, tu recrée ta vignette, c'est plus simple...
Flachy Joe
Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
1 -
Ben non puisque tu peux pas avoir la même date pour la modification de l'image source et de la vignette, à moins que tu ne compte modifier l'image source au moment de la création de la vignette ?
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
ou comparaison de deux filemtime ...
Flachy Joe
Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
1 -
Je voit deux solutions : On peut soit intégrer une date en fin de nom de fichier de vignette et comparer avec le résultat de filemtime sur l'image de base, soit utiliser une somme de contrôle sur le fichier (crc32, md5 ou autre) qu'on utilise directement comme nom de fichier.
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
faire une sorte de timestamp comme nom de l'image, et chaque fois comparer avec celui de la grande image...
bref c'est une excellente idée!
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
ça c'est vraiment balèze!
Flachy Joe
Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
1 -
C'est sur que ça prend du temps, en fait le mieux serait de gérer un cache de vignette et de les régénérer que si l'image a changée.
GillesWebmaster
Messages postés
507
Date d'inscription
mercredi 30 juin 2004
Statut
Membre
Dernière intervention
29 juillet 2009
1 -
Jolie fonction, plus propre que if... elseif... else.

Malheureusement je trouve la méthode "à la volée" inefficace ! C'est nettement trop lourd de générer des images de la sorte: selon la taille, ça prend quelques disièmes de secondes à quelques secondes! Imagine: 100 visiteurs, une galerie de 25 images dont il faut faire la miniature... bonjours la latence (et sur tout le site puisque la RAM du serveur est mangée)...

Merci pour ton script, j'apprécie, mais j'ai déjà tout sous la main... (j'ai juste publié ce détail par ce qu'il manquait sur la toile).

D'ailleurs je supporte difficilement les grosses sources complexes, à mon avis mieux vaut des simples sources rapides et propres!
Flachy Joe
Messages postés
2120
Date d'inscription
jeudi 16 septembre 2004
Statut
Membre
Dernière intervention
4 novembre 2019
1 -
Voui, mais niveau codage c'est moyen, les if elseif je trouve pas ça beau :)

J'avais codé un truc comme ça :

//Pour renvoyer l'image source
function sendSource($filename){
readfile($filename);
exit;
}

//récupère les dimensions et le type mime
$size = getimagesize($filename);

$width = $size[0];
$height = $size[1];

//Pas de changement de type...
header("Content-type: {$size['mime']}");

//Présence de l'extension GD, IMG_JPEG n'est défini que si elle est présente.
if (!IMG_JPEG)
sendSource($filename);

//Détermine les fonctions correspondant au type
switch ($size[2]){
case IMG_GIF:
$fctImageCreate = imagecreatefromgif;
$fctImage = imagegif;
break;
case IMG_JPEG:
$fctImageCreate = imagecreatefromjpeg;
$fctImage = imagejpeg;
break;
case IMG_PNG:
$fctImageCreate = imagecreatefrompng;
$fctImage = imagepng;
break;
case IMG_WBMP:
$fctImageCreate = imagecreatefromwbmp;
$fctImage = imagewbmp;
break;
case IMG_XBM:
$fctImageCreate = imagecreatefromxbm;
$fctImage = imagexbm;
break;
default:
//Type non géré;
sendSource($filename);
}

Au lieu de
$source = imagecreatefromXXX($nomImage);
On fait alors
$source = $fctImageCreate($nomImage);

De même plutôt que d'écrire le fichier sur le serveur on peux envoyer directement le code au client, dans ce cas l'utilisation devient :

Ce qui n'a pas besoin d'être dans un fichier .php pour fonctionner.

Si ça t'intéresse j'ai le script complet qui laisse le choix entre redimensionner en gardant le rapport hauteur/largeur d'origine ou en découpant les bords. J'ai aussi implémenté des dimensions minimales, dans le cas où l'image est très étroite il peut être intéressant de conserver une certaine largeur par exemple.