Création de miniatures d'images dont la hauteur et largeur maximale sont fixées

Eléphant du PHP | 117 Messages

14 oct. 2008, 16:25

Bonjour à tous, je cherche un script qui pourrait redimenssionner une image lorsque je l'upload en gardant les proportions bien sûr mais en limitant la hauteur et la largeur à une certaine taille.
Est-ce possible ?

Par exemple j'affiche des miniatures de 60*60 sur mon site si une image fait 140*60, elle va sortir du cadre, elle devrait donc faire environ 60*20 (au hasard mais c'est juste pour montrer ce que je recherche).

Et puis j'ai une autre question, j'ai une liste de 500 images qui n'ont pas de miniatures, peut-on créer les miniatures de ces 500 images qui sont déjà sur le serveur ?

Merci d'avance.

Mammouth du PHP | 19672 Messages

14 oct. 2008, 16:40

Je te ne donnerai pas le code tout fait, mais voici la piste pour que tu le développes toi-même :

La réponse à la première question est purement logique et mathématique, et quand je dis "mathématique", ça prend pas un doctorat, rassure-toi. Réfléchis à la manière de procéder :
-1- quelles données connais-tu au départ ?
-2- quelles dimensions maximales peuvent être utilisées ?
-3- ton code doit analyser la proportion largeur/hauteur de l'original... pour savoir si on réduit le plus en largeur ou en hauteur pour rentrer dans le cadre du point 2.

Commence avec ça, et élabore ton raisonnement, on t'aidera à avancer.

Pour les 500 miniatures, tu peux toujours imaginer de devoir les créer à la volée avec le script en question si la miniature n'existe pas, mais à la demande seulement. Ça veut dire intercepter coté serveur quelle miniature est demandée, existe-t-elle et selon le cas l'afficher ou la créer et l'afficher.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 117 Messages

14 oct. 2008, 17:30

En fait pour la génération de miniature, je pensais supprimer les anciennes miniatures, toute façon elles ne sont pas proportionnelles.
Et ensuite les refaire toute en même temps.

Mammouth du PHP | 19672 Messages

14 oct. 2008, 17:33

En fait pour la génération de miniature, je pensais supprimer les anciennes miniatures, toute façon elles ne sont pas proportionnelles.
Et ensuite les refaire toute en même temps.
Pourquoi tout d'un coup : ça va bouffer un maximum de ressources en très peu de temps... pour peu de chose en fait. En les laissant se régénérer au fur et à mesure des demandes, tu ne consommes pas trop de ressources serveur et l'autre avantage est que si tu rajoutes une image dans ta base, le script sera déjà en place pour en créer la miniature si besoin est, et ce automatiquement. :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

x@v
Mammouth du PHP | 570 Messages

17 oct. 2008, 12:59

question simple, réponse compliqué...
Donc pour confimer l'exception de cette règle
je mets les mesure en html
ex:
echo '<img src="'.$img.'" alt="'.$description.'" height="100px" width="100px" />';

Mammouth du PHP | 19672 Messages

17 oct. 2008, 13:17

question simple, réponse compliqué...
Donc pour confimer l'exception de cette règle
je mets les mesure en html
ex:
echo '<img src="'.$img.'" alt="'.$description.'" height="100px" width="100px" />';
Ça, c'est une très mauvaise idée et si ça peut simplifier le développement, ça n,est qu'en apparence parce que ça veut dire que tu vas générer des miniatures qui ont une taille fixe avec un fond à l'intérieur duquel va se mettre l'image ré-échantillonnée proportionnellement.

J'ajouterais que tant qu'à opter pour cette solution, autant mettre une classe CSS et définir les dimensions dans une feuille de style externe.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

x@v
Mammouth du PHP | 570 Messages

17 oct. 2008, 14:46

Code : Tout sélectionner

tu vas générer des miniatures qui ont une taille fixe avec un fond à l'intérieur duquel va se mettre l'image ré-échantillonnée proportionnellement
J'ai pas compris la difficulté ?

Mammouth du PHP | 19672 Messages

17 oct. 2008, 14:56

Ce n'est pas difficile, c'est un problème d'esthétique, parce que ça implique un fond transparent. Donc tu es limité au gif ou au png8 (le 24 n'est pas encore universellement supporté par tous les navigateurs)

Et puis tu rajoutes une opération : au lieu de créer une image proportionnelle, tu commences par créer une images de taille fixe et tu dois ensuite en créer une seconde proportionnelle à l'original que tu devras incruster dans la première. Pour quel gain ???
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
fab
ViPHP | 2657 Messages

17 oct. 2008, 15:23

Le problème en fixant la taille en HTML ou CSS c'est que tu risques d'avoir un rendu très laid si la taille fixé ne correspond pas aux proportions de l'image affiché.

Je pense que le mieux est de créér les miniatures directement dans la bonne taille et Cyrano je vois pas trop pourquoi tu veux faire un système complexe d'interception de demande d'ffichage il n'y a que 500 images ça va plomber le serveur pendant 2 minutes maximum :)

Pour créer des miniature dans des bonnes dimensions il faut que tu détermines la taille max de ta nouvelle miniatures
		$t_width_max = 200;
		$t_height_max = 150;
que tu fasses un ratio des dimensions originales
list($width_orig, $height_orig) = getimagesize($fileTmpPath); // $fileTmpPath est ton image
$ratio_orig = $width_orig/$height_orig;
et ensuite il faut calculer les dimensions de la miniature en fonction de si elle est plus haute que large ou l'inverse. Et aussi prendre en compte le cas ou l'image de base est plus petite que la miniature donc :
		if($width_orig < $t_width_max && $height_orig < $t_height_max) {
			$t_height = $height_orig;
			$t_width = $width_orig;
		} elseif($height_orig > $width_orig) {
			$t_ratio = $height_orig / $t_height_max;
			$t_height = $t_height_max;
			$t_width = $width_orig / $t_ratio;
		} else {
			$t_ratio = $width_orig / $t_width_max;
			$t_width = $t_width_max;
			$t_height = $height_orig / $t_ratio;
		}
et enfin tu créé ta miniature ici $t_filePath est la destination finale pour créér ta miniature :) et tout ça en fonction de l'extension de ta jolie image :) que tu vas récuprer comme ça
$extension = strtolower(substr(strrchr($fileTmpPath, '.'), 1));
		$t_image_p = imagecreatetruecolor($t_width, $t_height);
		$t_quality = 80;
		switch($extension)
		{
			case 'jpeg':
			case 'jpg':
				$t_image = imagecreatefromjpeg($fileTmpPath);
				imagecopyresampled($t_image_p, $t_image, 0, 0, 0, 0, $t_width, $t_height, $width_orig, $height_orig);
				imagejpeg($t_image_p, $t_filePath, $t_quality);
			break;
			case 'png':
				$t_image = imagecreatefrompng($fileTmpPath);
				imagecopyresampled($t_image_p, $t_image, 0, 0, 0, 0, $t_width, $t_height, $width_orig, $height_orig);
				imagepng($t_image_p, $t_filePath, $t_quality);
			break;
			case 'gif':
				$image = imagecreatefromgif($fileTmpPath);
				imagecopyresampled($t_image_p, $t_image, 0, 0, 0, 0, $t_width, $t_height, $width_orig, $height_orig);
				imagegif($t_image_p, $t_filePath, $t_quality);
			break;
		}
tu peux changer la qualité avec la variable $t_quality cependant 80 reste très correcte, si tu dois changer pour une miniature descend plutot cette valeur qu'autre chose :) ça te permettre de gagner de la place un peu

met tout les morceaux de code à la suite et tu dois avoir le code complet je pense :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Petit nouveau ! | 9 Messages

19 oct. 2008, 15:51

Si je peux me permettre (petit embryon que je suis qui se glisse entre les mamouths)...

Le code calculant les dimensions du thumbnail en fonction du ratio de l'image originale est vraisemblablement la meilleure solution lors de l'upload d'une image.

Mais si 500 images sont déjà en ligne et qu'il faut juste les mettre à jour une fois pour toute, je les rapatrierais en local, et utiliserais un soft genre Photoshop avec un script de traitement par lot, et ensuite je réuploade en écrasant mes "mauvaises" thumbnails. C'est peut-être plus simple que de passer par PHP, et ça ne prend que quelques minutes.

Et on utilise le script pour les futurs uploads...

x@v
Mammouth du PHP | 570 Messages

19 oct. 2008, 16:20

Oui mais ont ne peux pas toujours prendre photoshop, il faut le connaître (utilisateur finaux), pour éviter une gestion répétitive des tâches il vaut mieux avoir du dynamique.

ViPHP
fab
ViPHP | 2657 Messages

19 oct. 2008, 17:18

L'astuce photoshop c'est pas forcement la meilleure du tout!
Imagine que tu as d'autres fichiers qui prennent du poids dans tes dossiers ? tels que des vidéos?

Et puis le script de miniaturisation faut le faire dans tous les cas pour quand l'utilisateur upload une photo :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Petit nouveau ! | 9 Messages

19 oct. 2008, 19:42

oui, tout à fait, je suis d'accord avec vous pour les nouvelles images.
Le code calculant les dimensions du thumbnail en fonction du ratio de l'image originale est vraisemblablement la meilleure solution lors de l'upload d'une image.
Je parlais juste d'une solution rapide pour le concepteur du site pour rattraper le coup si le mal était déjà fait avec 500 thumbnails déjà en ligne et qu'il faut remplacer.

ViPHP
AB
ViPHP | 5818 Messages

19 oct. 2008, 22:38

L'astuce photoshop c'est pas forcement la meilleure du tout!
Imagine que tu as d'autres fichiers qui prennent du poids dans tes dossiers ? tels que des vidéos?

Et puis le script de miniaturisation faut le faire dans tous les cas pour quand l'utilisateur upload une photo :)
Oui j'utilise un script très semblable au tiens pour un redimensionnement lors de l'upload http://www.phpfrance.com/forums/voir_re ... php#266544

Mais quand j'ai le temps je fais du redimensionnement avec logiciel photo et traitement par lot. Simplement parce qu'il est impossible (d'après mes nombreux essais) d'obtenir un résultat de qualité équivalente avec les fonctions php bien que le résultat soit suffisant dans la plupart des cas.

Eléphant du PHP | 117 Messages

20 oct. 2008, 18:56

Je vais miniaturiser avec photoshop les images deja présentes sur le site puis mon script php fera le reste pour les nouvelles images.

Par contre, c'est peut-être trop demander mais comment fait-on avec photoshop pour créer des miniatures à la volée avec comme paramètres une largeur et une hauteur maximale.

En fait je voudrais par exemple que toutes les images de mon dossier "photos/" puissent être redimensionnées par photoshop en gardant ses paramètres.

C'est possible ?

Merci d'avance.