IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[Galerie] Script de redimensionnement d'images carrées


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut [Galerie] Script de redimensionnement d'images carrées
    Bonjour,

    Voici ci-dessous un script, qui redemissionne les images rectangulaires au format carré sans perte de pixels (croppage et redimensionnement)

    Ce script marche super bien!

    Cependant, j'aimerais adapter ce script pour redimensionner une image en fonction d'une hauteur et d'une largeur donner...

    Exemple :

    J'ai une image de 400px de largeur par 200px de hauteur.

    Et je veux qu'elle devienne 170px de largeur par 115px de hauteur...


    Donc comment modifier la fonction ci-dessous pour faire un redimenssionnement et ensuite un croppage de manière à avoir une miniature rectangulaire sans déformation de pixel?

    Un grand merci!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
     
    function thumbnail($src, $dest='', $largeur) { 
     
    	ini_set('memory_limit','16M');
     
    	if(!$dest)
    		$dest = $src;
     
    	$infos_image=getimagesize($src);
    	$src_x = $infos_image[0]; // largeur de l'image
    	$src_y = $infos_image[1]; // hauteur de l'image 
     
     
    	$im_src=@imagecreatefromjpeg($src);
     
    	if(!$im_src)
    		$im_src=@imagecreatefrompng($src);
     
    	if(!$im_src)
    		$im_src=@imagecreatefromgif($src);	
     
     
    	if ($im_src=='') 
    		return array_push($_SESSION['warning'], WRONG_FILE_TYPE); 
     
    		//on determine un carré avec la plus petite largeur
    		if($src_x >= $src_y){
     
    			$dim=$src_y; 
    			$verticale='1';	
     
    		}elseif($src_x <= $src_y){
     
    			$dim=$src_x; 
    			$horizontale='1';
     
    		}else
    			$dim=$src_x;
     
    		//on determine le point de depart x,y
    		if($verticale == '1'){
     
    		 $point_x_ref=($src_x/2)-($dim/2);
    		 $point_y_ref='0';
     
    		}
     
    		if($horizontale == '1'){
     
    		 $point_x_ref='0';
    		 $point_y_ref=($src_y/2)-($dim/2);
     
    		}
     
    		$im_dest=imagecreatetruecolor($largeur, $largeur); 
     
    		imagecopyresampled($im_dest, $im_src, 0, 0, $point_x_ref, $point_y_ref, $largeur, $largeur, $dim, $dim); 
    		imagedestroy($im_src); 
    		imagejpeg($im_dest, $dest, 90); 
    		imagedestroy($im_dest); 	
     
    }

  2. #2
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    J'ai ça en stock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    function ImageResize($pImage, $t_width, $t_height) 
    {
            $iCanvas = @ImageCreateTrueColor($t_width, $t_height);
            $s_width = ImageSX($pImage);
            $s_height = ImageSY($pImage);
            ImageCopyResampled($iCanvas, $pImage, 0, 0, 0, 0, $t_width, $t_height, $s_width, $s_height);
            return $iCanvas;
    }
     
    function Vignette($source, $destination, $x = 100, $y = 100) // réduction sans dénaturation de l'image
    {
    		$img = imagecreatefromstring(file_get_contents($source));
    		if(!$img) return false;
            $xx = ImageSX($img);
            $yy = ImageSY($img);
            if($xx / $yy > $x / $y)
            { // réduction sur X
                    $f = $y / $xx; 
                    $rX = $xx * $f;
                    $rY = $yy * $f;
            }
            else
            { // réduction sur Y
                    $f = $x / $yy; 
                    $rX = $xx * $f;
                    $rY = $yy * $f;        
            }
            imagejpeg(ImageResize($img, $rX, $rY), $destination);
    }
    Normalement, elle marche... Enfin si c'est bien ma dernière version, c'est un peu le bordel dans mes archives, et je crois me souvenir que ma 1erversion buggait. Fait signe si y'a un pb, je regarderais.

    Edit : Ah oui, j'ai oublié d'expliquer... Ce script est censé redimensionner l'image "à l'echelle" en fonction de ce qu'il est possible de faire tenir dans l'emplacement $x-$y que tu passes n parametre a la fonction vignette...

    Aussi ,si tu lui donne une image de 200*100 a faire tenir sur un carré de 100*100, l'image retournée devrait faire 100*50.

  3. #3
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    Salut,

    C'est un bon début mais je cherche à faire légèrement différent.

    Je m'explique:

    J'ai une image de 425 x 320 pixels (image originale)

    J'aimerais la redimensionner sans écrasement d'image sous un format de :

    170 x 115 pixels

    L'idée serait donc de redimensionner en 170 x 128 pixels

    Et ensuite, de la cropper au centre ou à partir d'un coin en 170 x 115 pixels...

    Est-ce réalisable?

    Merci de ton aide!

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    Citation Envoyé par Sayrus Voir le message
    J'ai une image de 425 x 320 pixels (image originale)

    J'aimerais la redimensionner sans écrasement d'image sous un format de :

    170 x 115 pixels

    L'idée serait donc de redimensionner en 226 x 170 pixels

    Et ensuite, de la cropper au centre ou à partir d'un coin en 170 x 115 pixels...
    Heuu non, je vois pas... Enfin pas avec ton exemple... Si je suppose que tu t'es emélé les pinceau, alors je comprend que tu veux faire un peu ce que je propose, sauf qu'au lieu que l'algo sorte une image de 100*50, il sorte une image de 200*100 et qu'on la découpe avec des marges équivalentes de chaque coté pour obtenir une image de 100*100 (donc on enleve 50px de chaque cotés)...

    C'est bien ça ?

  5. #5
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    Je me suis trompé dans mon exemple,

    Voici l'explication corrigée :

    J'ai une image de 425 x 320 pixels (image originale)

    J'aimerais la redimensionner sans écrasement d'image sous un format de :

    170 x 115 pixels

    L'idée serait donc de redimensionner en 170 x 128 pixels

    Et ensuite, de la cropper au centre ou à partir d'un coin en 170 x 115 pixels...

    Ainsi, je la recroppe de 13 pixels et mon image occupe bien toute la zone 170 x115.

    Le but n'est pas de compléter les pixels manquant par du blanc ou du noir ou tout autre couleur, mais bien remplir tout le cadre par l'image même si il faut recropper.


    Est-ce plus clair? Je sais c'est pas évidant a expliquer.

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 504
    Points : 470
    Points
    470
    Par défaut
    oui oui, c'est bien ce que j'avais compris malgré l'exemple, a l'endroit ou on découpe près...

    A froid, je dirais qu'il suffir de remplacer dans ce que je propose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if($xx / $yy > $x / $y)
     //par 
     if($xx / $yy <= $x / $y)
    Puis faire un découpage simple (imagecopy) à la taille que tu désires du résultat obtenu...

  7. #7
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    Merci pour ton aide!

    En m'inspirant de ton code et de tes explications, j'ai modifié mon code comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    function thumbnail($src, $dest='', $width_rezised=170, $height_rezised=115) { 
     
     
     
    	if(!$dest)
    		$dest = $src;
     
    	$infos_image=getimagesize($src);
    	$width_img = $infos_image[0]; // 425
    	$height_img = $infos_image[1]; // 320 
     
     
    	$im_src=imagecreatefromjpeg($src);
     
    	if(!$im_src)
    		$im_src=imagecreatefrompng($src);
     
    	if(!$im_src)
    		$im_src=imagecreatefromgif($src);	
     
     
    	if ($im_src=='') 
    		return array_push($_SESSION['warning'], WRONG_FILE_TYPE); 
     
     
    		if($width_img<$width_rezised)
    			die('ERROR : Image width too small');
    		elseif($height_img<$height_rezised)
    			die('ERROR : Image height too small');
     
    		$horizontal=0;
     
    		//on determine un carré avec la plus petite largeur
    		if($width_img >= $height_img){
     
    			$indice = $width_rezised / $width_img  ;
    			$check_height= $height_img * $indice;
     
    			if($check_height>=$height_rezised)
    				$horizontal=1;
     
    		}
     
    		if($horizontal==0){
     
    			$indice = $height_rezised / $height_img  ;
    			$check_width= $width_img * $indice;
     
    			if($check_width < $width_rezised)
    				die('ERROR : Image height too small');
     
     
    		}
     
    		if($horizontal==1){
     
    			$cropped_width=$width_rezised;
    			$cropped_height=$check_height;
     
     
     
    		}else{
     
    			$cropped_width=$check_width;
    			$cropped_height=$height_rezised;
    		}
     
     
    		$im_dest=imagecreatetruecolor($width_rezised, $height_rezised); 
     
    		imagecopyresampled($im_dest, $im_src, 0, 0, 0, 0, $cropped_width, $cropped_height, $width_img, $height_img);		
     
    		imagedestroy($im_src); 
    		imagejpeg($im_dest, $dest, 100); 
    		imagedestroy($im_dest); 
     
    }
    C'est a améliorer et tout mais ça marche bien!

    Merci!!!

  8. #8
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 130
    Points : 76
    Points
    76
    Par défaut
    comment utilise cette fonction

  9. #9
    Membre confirmé Avatar de Sayrus
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    899
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 899
    Points : 570
    Points
    570
    Par défaut
    En passant les paramètres en argument tout simplement.

    L'image source $_FILES['ma_var'], la destination, largeur souhaitée, hauteur souhaitée...

    Mais il faut faire quelques tests par sois même pour se rendre compte de l'utilisation et d'améliorer la fonction selon ses désirs.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Script de redimensionnement d'image à l'upload
    Par vaxi71 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/05/2016, 19h12
  2. Photoshop script pour redimensionner une image
    Par corenitec dans le forum Imagerie
    Réponses: 3
    Dernier message: 05/02/2012, 19h40
  3. Script qui redimensionne les images
    Par Laetitia7771 dans le forum Langage
    Réponses: 1
    Dernier message: 02/01/2012, 15h21
  4. Script de redimensionnement d'images.
    Par JeanJean75 dans le forum Langage
    Réponses: 9
    Dernier message: 09/02/2010, 19h11
  5. [Forum] Script upload + redimensionnement image jpg
    Par baleiney dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 03/07/2006, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo