Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 2023
-
7 juil. 2009 à 10:50
sabiha93
Messages postés32Date d'inscriptionjeudi 18 mai 2006StatutMembreDerniè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.
sabiha93
Messages postés32Date d'inscriptionjeudi 18 mai 2006StatutMembreDerniè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és2Date d'inscriptionjeudi 8 décembre 2005StatutMembreDernière intervention19 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és8Date d'inscriptiondimanche 28 juin 2009StatutMembreDernière intervention16 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.
// 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és2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 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és156Date d'inscriptionlundi 23 juin 2003StatutMembreDernière intervention27 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és8Date d'inscriptionlundi 15 décembre 2008StatutMembreDernière intervention12 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 !
masternico
Messages postés487Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention 1 septembre 2011 13 juil. 2009 à 13:07
pardon, je n'avais pas compris
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 13 juil. 2009 à 13:01
Je ne parlais pas de sauvegarde des images mais de la méthode de recadrage...
masternico
Messages postés487Date d'inscriptiondimanche 5 octobre 2003StatutMembreDerniè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és496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 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és113Date d'inscriptionmardi 25 février 2003StatutMembreDernière intervention28 mars 2010 13 juil. 2009 à 08:39
et je te met une note, la moindre des choses
;)
masternico
Messages postés487Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention 1 septembre 2011 13 juil. 2009 à 07:54
gilleswebmaster +1
vincseize
Messages postés113Date d'inscriptionmardi 25 février 2003StatutMembreDernière intervention28 mars 2010 13 juil. 2009 à 02:12
Dans tous les cas, effectivement bien pratique
merci les gars
GillesWebmaster
Messages postés496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 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és2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 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és496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 7 juil. 2009 à 11:51
ou comparaison de deux filemtime ...
Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 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és496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 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és496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 7 juil. 2009 à 11:37
ça c'est vraiment balèze!
Flachy Joe
Messages postés2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 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és496Date d'inscriptionmercredi 30 juin 2004StatutMembreDernière intervention29 juillet 20091 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és2103Date d'inscriptionjeudi 16 septembre 2004StatutMembreDernière intervention21 novembre 20231 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.
26 août 2010 à 14:30
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 :)
19 janv. 2010 à 07:47
8 déc. 2009 à 15:39
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
5 sept. 2009 à 19:34
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+
28 août 2009 à 11:47
21 juil. 2009 à 16:35
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+
13 juil. 2009 à 13:07
13 juil. 2009 à 13:01
13 juil. 2009 à 12:50
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 . '">
';
}
13 juil. 2009 à 12:15
Dommage qu'il y ait trop de sources qui se ressemblent mais aucune qui gère le pb dont nous traitons ici...
@++
13 juil. 2009 à 08:39
;)
13 juil. 2009 à 07:54
13 juil. 2009 à 02:12
merci les gars
7 juil. 2009 à 11:59
et à chaque modif de la grande image, tu recrée ta vignette, c'est plus simple...
7 juil. 2009 à 11:55
7 juil. 2009 à 11:51
7 juil. 2009 à 11:49
7 juil. 2009 à 11:39
bref c'est une excellente idée!
7 juil. 2009 à 11:37
7 juil. 2009 à 11:35
7 juil. 2009 à 11:25
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!
7 juil. 2009 à 10:50
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.