begin process at 2010 09 02 22:23:59
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > VIGNETTE EN RECADRANT AVEC TAILLE FIXE!

VIGNETTE EN RECADRANT AVEC TAILLE FIXE!


 Information sur la source

Note :
8 / 10 - par 4 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Classé sous :vignette, thumbnail, redimensionner, recadrer, sanscompression Niveau :Débutant Date de création :06/07/2009 Date de mise à jour :07/07/2009 12:11:32 Vu / téléchargé :3 621 / 250

Auteur : GillesWebmaster

Ecrire un message privé
Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Marre de voir des scripts qui se contentent de redimensionner l'image pour créer des vignettes?
Frustré d'avoir des vignettes de tailles différente parce que vous ne voulez pas les compresser?

La solution est pourtant simple, recadrer la vignette et laisser tomber les rognures latérales pour que le thumbnail soit toujours de taille fixe!

Or jusqu'à présent personne n'a pris la peine de poster une source pareille ou du moins, pas une source aussi simple.

En somme cette source reste très simple, j'en suis conscient; j'espère juste qu'elle vous sera utile...

Source

  • <?php
  • function get_extension($filename)
  • {
  • $ext = substr(strtolower(strrchr(basename($filename), ".")), 1);
  • return $ext;
  • }
  • function imageanytype ($image,$nomImage, $quality=100)
  • {
  • if (!IMG_JPEG) exit("erreur: librairie GD non activée!");
  • switch (get_extension($nomImage))
  • {
  • case "gif":
  • return imagegif($image,$nomImage);
  • $fctImage = imagegif;
  • break;
  • case "jpg":
  • return imagejpeg($image,$nomImage,$quality);
  • break;
  • case "png":
  • return imagepng($image,$nomImage);
  • break;
  • case "wbmp":
  • case "bmp":
  • return imagewbmp($image,$nomImage);
  • break;
  • case "xbm":
  • return imagexbm($image,$nomImage);
  • break;
  • }
  • }
  • function imagecreatefromanytype ($nomImage)
  • {
  • if (!IMG_JPEG) exit("erreur: librairie GD non activée!");
  • $info = getimagesize($nomImage);
  • switch ($info[2])
  • {
  • case IMG_GIF:
  • return imagecreatefromgif($nomImage);
  • $fctImage = imagegif;
  • break;
  • case IMG_JPEG:
  • return imagecreatefromjpeg($nomImage);
  • break;
  • case IMG_PNG:
  • return imagecreatefrompng($nomImage);
  • break;
  • case IMG_WBMP:
  • return imagecreatefromwbmp($nomImage);
  • break;
  • case IMG_XBM:
  • return imagecreatefromxbm($nomImage);
  • break;
  • }
  • }
  • function vignette ($nomImage, $largeur_dest = 100,$hauteur_dest = 75)
  • {
  • $source=imagecreatefromanytype($nomImage);
  • $largeur_src = imagesx($source);
  • $hauteur_src = imagesy($source);
  • $imageFinale = imagecreatetruecolor ($largeur_dest,$hauteur_dest);
  • $hauteur_temp=floor($largeur_dest*$hauteur_src/$largeur_src);
  • $largeur_temp=floor($largeur_src*$hauteur_dest/$hauteur_src);
  • if($largeur_temp >= $hauteur_temp AND $largeur_temp >= $largeur_dest) //on prend la hauteur
  • {
  • $semi_diff= floor(($largeur_temp - $largeur_dest )/2);
  • imagecopyresampled($imageFinale, $source, -$semi_diff, 0, 0,0, $largeur_temp, $hauteur_dest, $largeur_src, $hauteur_src);
  • }
  • else //on prend la largeur
  • {
  • $semi_diff= floor(($hauteur_temp - $hauteur_dest )/2);
  • imagecopyresampled($imageFinale, $source, 0, -$semi_diff, 0, 0, $largeur_dest, $hauteur_temp, $largeur_src, $hauteur_src);
  • }
  • imageanytype($imageFinale,dirname($nomImage)."/_thb_".basename($nomImage),100);
  • return(dirname($nomImage)."/_thb_".basename($nomImage));
  • }
  • ?>
<?php
function get_extension($filename)
	{
		$ext = substr(strtolower(strrchr(basename($filename), ".")), 1);
		return $ext;
	}
function imageanytype ($image,$nomImage, $quality=100)
	{
		if (!IMG_JPEG) exit("erreur: librairie GD non activée!");
		
		switch (get_extension($nomImage))
			{
				case "gif":
					return imagegif($image,$nomImage);
					$fctImage = imagegif;
					break;
				case "jpg":
					return imagejpeg($image,$nomImage,$quality);
					break;
				case "png":
					return imagepng($image,$nomImage);
					break;
				case "wbmp":
				case "bmp":
					return imagewbmp($image,$nomImage);
					break;
				case "xbm":
					return imagexbm($image,$nomImage);
					break;
			}
	}
function imagecreatefromanytype ($nomImage)
	{
		if (!IMG_JPEG) exit("erreur: librairie GD non activée!");
		$info = getimagesize($nomImage);
		switch ($info[2])
			{
				case IMG_GIF:
					return imagecreatefromgif($nomImage);
					$fctImage = imagegif;
					break;
				case IMG_JPEG:
					return imagecreatefromjpeg($nomImage);
					break;
				case IMG_PNG:
					return imagecreatefrompng($nomImage);
					break;
				case IMG_WBMP:
					return imagecreatefromwbmp($nomImage);
					break;
				case IMG_XBM:
					return imagecreatefromxbm($nomImage);
					break;
			}
	}
function vignette ($nomImage, $largeur_dest = 100,$hauteur_dest = 75)
	{
		$source=imagecreatefromanytype($nomImage);
		$largeur_src = imagesx($source);
		$hauteur_src = imagesy($source);
		$imageFinale = imagecreatetruecolor ($largeur_dest,$hauteur_dest);
		
		$hauteur_temp=floor($largeur_dest*$hauteur_src/$largeur_src);
		$largeur_temp=floor($largeur_src*$hauteur_dest/$hauteur_src);
		
		if($largeur_temp >= $hauteur_temp AND $largeur_temp >= $largeur_dest) //on prend la hauteur
			{
				
				$semi_diff= floor(($largeur_temp - $largeur_dest )/2);
				imagecopyresampled($imageFinale, $source, -$semi_diff, 0, 0,0, $largeur_temp, $hauteur_dest, $largeur_src, $hauteur_src);				
			}
		else //on prend la largeur
			{
				
				$semi_diff= floor(($hauteur_temp - $hauteur_dest )/2);
				imagecopyresampled($imageFinale, $source, 0, -$semi_diff, 0, 0, $largeur_dest, $hauteur_temp, $largeur_src, $hauteur_src);
			}
		imageanytype($imageFinale,dirname($nomImage)."/_thb_".basename($nomImage),100); 
		return(dirname($nomImage)."/_thb_".basename($nomImage));
	}
?>

 Conclusion

Pour afficher le résultat:
<img src="<?php echo vignette("SourceImage.jpg"); ?>" style="border:solid 1px black;" />
ou

<img src="<?php echo vignette("SourceImage.jpg",70,50); ?>" style="border:solid 1px black;" />

voire

<a href="SourceImage.jpg"><img src="<?php echo vignette("SourceImage.jpg",75,50); ?>" style="border:solid 1px black;" /></a>

P.S.: n'oubliez pas:
1. Il vous faut la librairie GD activée
2. Il vous faut les droits d'écriture sur le dossier
3. enjoy ;-)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

07 juillet 2009 12:11:33 :
Mise à jour selon conseils de Flachy Joe

 Sources du même auteur

Source avec Zip Source avec une capture N/X API: GOOGLE MAPS DEPUIS PHP VALID W3C
Source avec Zip Source avec une capture CARTE DE L'EUROPE EN FONCTION DES VISITEURS
XML AVEC SIMPLE XML
TEMPS D'EXECUTION
NEWSLETTER SIMPLE ENREGISTREMENT DES DONNES

 Sources de la même categorie

MANIPULATION DES DONNÉES IPTC par shevabam
Source avec Zip Source avec une capture AJOUTER DES EFFETS DE PERSPECTIVE ET DES EFFETS DE REFLET SU... par zulrigh
Source avec Zip Source avec une capture METTEZ VOS IMAGES OU VOS PHOTOS EN 3D ; EN PERSPECTIVE par zulrigh
Source avec Zip FAIRE DES MINIATURE D'IMAGE, DES PHOTOS POUR LES PROFILS par zulrigh
Source avec Zip Source avec une capture CARTOGRAPHIE DYNAMIQUE DE LA FRANCE AVEC UNE BASE MYSQL ET D... par buchron

 Sources en rapport avec celle ci

REDIMENSIONNER UNE IMAGE EN PHP par digitaldax
Source avec Zip Source avec une capture SANYBEE GALLERY par sakini
Source avec Zip REDIMENSIONNER UNE IMAGE PHP (GD VERSION 2 REQUISE) par CrazyShooter
REDIMENTION D'IMAGE, LIBRAIRIE GD par 17l7
Source avec Zip Source avec une capture CRÉATION DE THUMBNAIL + COIN ROND + EFFET ROLLOVER par josh666

Commentaires et avis

Commentaire de Flachy Joe le 07/07/2009 10:50:55

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 :
<img src="vignette.php?file=maphoto.jpg&maxheight=70" alt="miniature de maphoto.jpg" />
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.

Commentaire de GillesWebmaster le 07/07/2009 11:25:48

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!

Commentaire de Flachy Joe le 07/07/2009 11:35:08

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.

Commentaire de GillesWebmaster le 07/07/2009 11:37:25

ça c'est vraiment balèze!

Commentaire de GillesWebmaster le 07/07/2009 11:39:01

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!

Commentaire de Flachy Joe le 07/07/2009 11:49:13

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.

Commentaire de GillesWebmaster le 07/07/2009 11:51:21

ou comparaison de deux filemtime ...

Commentaire de Flachy Joe le 07/07/2009 11:55:33

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 ?

Commentaire de GillesWebmaster le 07/07/2009 11:59:13

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...

Commentaire de vincseize le 13/07/2009 02:12:19

Dans tous les cas, effectivement bien pratique

merci les gars

Commentaire de masternico le 13/07/2009 07:54:49

gilleswebmaster +1

Commentaire de vincseize le 13/07/2009 08:39:03 8/10

et je te met une note, la moindre des choses
;)

Commentaire de GillesWebmaster le 13/07/2009 12:15:02

merci...
Dommage qu'il y ait trop de sources qui se ressemblent mais aucune qui gère le pb dont nous traitons ici...
@++

Commentaire de masternico le 13/07/2009 12:50:22

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 '<p><img src="' . $row_content->image_dir . $row_content->image_name . '"></p>';
}

Commentaire de GillesWebmaster le 13/07/2009 13:01:38

Je ne parlais pas de sauvegarde des images  mais de la méthode de recadrage...

Commentaire de masternico le 13/07/2009 13:07:53

pardon, je n'avais pas compris

Commentaire de GauldoMagique le 21/07/2009 16:35:13 7/10

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+

Commentaire de webrunner le 28/08/2009 11:47:09

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".

Commentaire de Flachy Joe le 05/09/2009 19:34:21

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+

Commentaire de palarcon le 08/12/2009 15:39:35 8/10

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

Commentaire de leymiris le 19/01/2010 07:47:58 9/10

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 :)

Commentaire de sabiha93 le 26/08/2010 14:30:41

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 :)

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Thumbnail en php ? [ par Vag ] Salut à tousJe voudrai savoir s'il est possible de générer une miniature (thumbnail) de résolution inférieure d'une image uploadée sur le serveur, tou redimensionner une image [ par kinooo ] Est ce que qq un pourrait m'expliquer comment faire pour redimensionner une image.et evantuellement comment afficher une image en taille reduite.merci Créer une vignette [ par cercleaventure ] Je vient de faire le tour des sources pour générer des vignettes mais je doit dire que je suis pomé.Ce que je cherche c'est un script qui m'affiche so Redimensionner le background d'un <table> [ par chewbacca156 ] Hello !Je souhaiterais que l'image de fond de mon menu (généré dynamiquement) s'adapte à la longueur de ce dernier. Tout simplement car une image en d redimensionner une fenetre [ par agora_13 ] Boujour,Je sais que ce que je chercher n'est pas du php mais je dois réaliser un programme en PHP MySQL et j'aimerais savoir comment on peut redimensi redimensionner une image [ par scoder ] Bonjour, je suis webmaster d'un site consacré au jeu en ligne, et j'ai une rubrique qui recense d'autres équipes. Elles ont chacune une bannière mais Recadrer une image pour faire une prévisualisation d'image [ par diedatnight ] J'aimerais savoir si il est possible de recadrer une section d'une image pour en faire une prévisualisation.Merci ! vignette automatique des sites [ par mgnet ] Bonjour à tous et à toutes je souhaiterai savoir comment procéder pour améliorer un annuaire et pouvoir faire une vignette qui sera mises à jour chaqu Thumbnails de mauvaise qualité [ par RockmanX ] Salut!Je me suis inspir&#233; d'une source de ce site pour cr&#233;er cette fonction:$imgsrc est l'adresse de l'image de mon serveur, $impwidth est la Redimensionner une page... [ par Leneuf8000 ] Rebonjour, je laisse pas mal de message aujourd'hui, mais je suis toujours bloqu&#233;... Apr&#232;s avoir r&#233;ussi &#224; int&#233;gr&#233; une pa


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Septembre 2010
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
27282930   

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,406 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales