VIGNETTE EN RECADRANT AVEC TAILLE FIXE!

Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 - 7 juil. 2009 à 10:50
sabiha93 Messages postés 32 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 32 Date d'inscription jeudi 18 mai 2006 Statut Membre Dernière intervention 5 août 2010
26 août 2010 à 14:30
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
19 janv. 2010 à 07:47
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
8 déc. 2009 à 15:39
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 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
5 sept. 2009 à 19:34
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
28 août 2009 à 11:47
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
21 juil. 2009 à 16:35
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 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
13 juil. 2009 à 13:07
pardon, je n'avais pas compris
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
13 juil. 2009 à 13:01
Je ne parlais pas de sauvegarde des images mais de la méthode de recadrage...
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
13 juil. 2009 à 12:50
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 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
13 juil. 2009 à 12:15
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 113 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 28 mars 2010
13 juil. 2009 à 08:39
et je te met une note, la moindre des choses
;)
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
13 juil. 2009 à 07:54
gilleswebmaster +1
vincseize Messages postés 113 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 28 mars 2010
13 juil. 2009 à 02:12
Dans tous les cas, effectivement bien pratique

merci les gars
GillesWebmaster Messages postés 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
7 juil. 2009 à 11:59
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 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
7 juil. 2009 à 11:55
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 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
7 juil. 2009 à 11:51
ou comparaison de deux filemtime ...
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
7 juil. 2009 à 11:49
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 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
7 juil. 2009 à 11:39
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 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
7 juil. 2009 à 11:37
ça c'est vraiment balèze!
Flachy Joe Messages postés 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
7 juil. 2009 à 11:35
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 496 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2009 1
7 juil. 2009 à 11:25
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 2103 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 21 novembre 2023 1
7 juil. 2009 à 10:50
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.
Rejoignez-nous