Précédent   Forum du club des développeurs et IT Pro > PHP > Scripts > Galeries
Galeries Forum d'entraide sur les scripts PHP de galeries multimédia (photos, vidéos, audio, ...). Avant de poster -> Galeries en PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2008, 13h33   #1
Sayrus
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 842
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 842
Points : 463
Points : 463
Par défaut 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 :
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); 	
 
}
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 13h55   #2
comode
Membre éclairé
 
Développeur informatique
Inscription : décembre 2008
Messages : 368
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 368
Points : 320
Points : 320
J'ai ça en stock :

Code :
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.
comode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 14h10   #3
Sayrus
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 842
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 842
Points : 463
Points : 463
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!
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 14h17   #4
comode
Membre éclairé
 
Développeur informatique
Inscription : décembre 2008
Messages : 368
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 368
Points : 320
Points : 320
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 ?
comode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 14h21   #5
Sayrus
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 842
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 842
Points : 463
Points : 463
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.
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 14h40   #6
comode
Membre éclairé
 
Développeur informatique
Inscription : décembre 2008
Messages : 368
Détails du profil
Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : décembre 2008
Messages : 368
Points : 320
Points : 320
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 :
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...
comode est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2008, 15h49   #7
Sayrus
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 842
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 842
Points : 463
Points : 463
Merci pour ton aide!

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

Code :
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!!!
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2009, 22h34   #8
nestam
Nouveau Membre du Club
 
Inscription : avril 2005
Messages : 120
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 120
Points : 39
Points : 39
comment utilise cette fonction
nestam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2009, 08h49   #9
Sayrus
Membre éprouvé
 
Avatar de Sayrus
 
Inscription : décembre 2005
Messages : 842
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : décembre 2005
Messages : 842
Points : 463
Points : 463
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.
Sayrus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 08h21.


 
 
 
 
Partenaires

Hébergement Web