MINIATURE SOUS CONTRAINTE OPTIMISÉE AU MAXIMUM

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 - 9 févr. 2004 à 19:13
cedeb1971 Messages postés 4 Date d'inscription jeudi 10 novembre 2011 Statut Membre Dernière intervention 2 octobre 2017 - 11 nov. 2011 à 01:34
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20267-miniature-sous-contrainte-optimisee-au-maximum

cedeb1971 Messages postés 4 Date d'inscription jeudi 10 novembre 2011 Statut Membre Dernière intervention 2 octobre 2017
11 nov. 2011 à 01:34
Bonsoir
Ce tuto super bien fait date un peu maintenant mais je viens de le trouver en faisant une recherche pour redimensionner des images online.
J'ai recopié le code intégralement en modifiant les chemins.

Cependant à la fin l'image créée et enregistrée est noire.

Que faire ?

Avez-vous la solution ?

D'avance merci
cedeb1971 Messages postés 4 Date d'inscription jeudi 10 novembre 2011 Statut Membre Dernière intervention 2 octobre 2017
10 nov. 2011 à 11:25
Bonjour à toutes et à tous

Ce tuto date et j'espère que quelqu'un pourra me répondre.

J'ai appliqué exactement le même code que ci-dessus en modifiant juste les chemins des images.

La fonction crèe bien une miniature mais cette miniature est noire. L'image initiale n'est pas associée.
Que faire ?

Merci
speedylol Messages postés 228 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 27 novembre 2013
28 oct. 2005 à 12:49
Comment fait tu ton appel au telechargement de l'image please???
lmaix Messages postés 2 Date d'inscription dimanche 10 juillet 2005 Statut Membre Dernière intervention 4 août 2005
4 août 2005 à 11:28
C'est bon j'ai rien dit... oubli du CHMOD !!! Alala il était tard aussi. Désolé et bravo encore.
lmaix Messages postés 2 Date d'inscription dimanche 10 juillet 2005 Statut Membre Dernière intervention 4 août 2005
4 août 2005 à 04:02
Salut je me lance à peine dans tout ce qui est retouche d'image et je dois vous dire que je suis tres admiratif de vos travaux et de votre communauté aussi...

Voilà le script de Pyroflo a l'air parfait pour mes besoins, donc merci à lui déjà.
Le seul soucis c'est que j'ai recopié tel quel le code en changeant bien evidement les variables de la fonction MakeThumb en MakeThumb('test.jpg',200,150); mais ca ne marche pas.

Voilà donc rien de bien méchant mais j'ai ce message d'erreur:

Warning: imagejpeg(): Unable to open 'images/mini_est.jpg' for writing in /home/www/image.php on line 46


Bon je débute donc excusez moi si je vous fait répeter. De plus j'ai fait un phpinfo(); j'ai GD2 donc je comprends pas.

Merci d'avance
cs_fab512 Messages postés 31 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 29 juin 2007
8 juil. 2004 à 13:23
vi, perso, je suis entrain de devellopper une galerie photo pour ma petite soeur, et mon voisin, avec une GUI simplifiée, quand j'aurais fini, je la metterais en ligne, pour avoir vos commentaires ;-)
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
8 juil. 2004 à 13:20
Exact, une telle fonction ne peut convenir à tout le monde :)
cs_fab512 Messages postés 31 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 29 juin 2007
8 juil. 2004 à 12:51
vi... en fait tout dépend de ce que tu veux faire :-)
sepultura666 Messages postés 7 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 16 octobre 2006
8 juil. 2004 à 12:49
le code que j'avais mis un peu plus haut contient des boucles pour une seule et bonne raison, si admettons que tu veuilles faire 10 redimentionnement successifs suivant la taille du fichier envoyer, ben tu peux le faire, suffit de mettre dans le array qui contient les taille tes valeurs, comme çà avec unseul script, non seulement tu optimise les images crées, mais en plus tu peux faire x redimentionnements

genre tu envoye une image en 1600x1200 et t veux qu'elle soit redimentionnée en : 1600*1200, 1280*960, 1024*768, 640*480, 576*384, 160*120, 80*60 ben tu met simplement les valeurs dans le array, et le script se charge de tout faire lui même en renommant les fichier suivant cette règle $nom_du_fichier."_".$taille.".jpg";

c'est vachement plus imple nan ???
cs_fab512 Messages postés 31 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 29 juin 2007
8 juil. 2004 à 12:24
[font name=fixedsys]

Donc voilà en gros ce que je fait:
On donne a la fonction une image :


Taille[1]
+-----------------+ T
| | a
| | i
| image | l
| | l
| | e
+-----------------+[0]


Maintenant on lui donne un rectangle :
largeur
+--------+
| | h
| | a
| | u
| recta | t
| ngle | e
| | u
| | r
| |
+--------+

Pour rentre l'image dans ce rectangle, en touchant deux bords, il y'a deux solutions :
Soit que le bord du haut touche le bord du haut, et le bord du bas touche le bord du bas, donc en definisant que la nouvelle image a pour hauteur la hauteur du rectangle, en appliquant le ratio (hauteur/largeur), on obtient la largeur nécéssairepour avoir une image proportionel, si cette valeur est plus grande que la largeur du rectangle.
Si la largeur ainsi définie est plus grande que la largeur du rectangle, on recommence en appliquant ce petit algorythme directement a la largeur
Est ce clair ?
LOL

@+++ tlm
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
8 juil. 2004 à 01:07
Pas très grave :)

Pour les boucles, je pensais pouvoir me rapprocher de la veleur minimale en "tatonnant".
cs_fab512 Messages postés 31 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 29 juin 2007
8 juil. 2004 à 01:04
dsl, je suis un boulet, pas capable de faire un ctrl+c dans le bon fichier... le code ci dessus ne marche que pour les carés, le code pour les rectangles (Pour que l'image $addr rentre dans le rectangle de dimension $hauteur, $largeur, en touchant au moins un des bords) est là :
<?
$image=imagecreatefromjpeg($addr);
$taille=getimagesize($addr);
$ratio=$taille[0]/$taille[1];
$hauteur2=$largeur*$ratio;
$largeur2=$hauteur/$ratio;
if($hauteur2<=$hauteur) $largeur2=$largeur;
else $hauteur2=$hauteur;
$image2=imagecreate($hauteur2,$largeur2);
imagecopyresized($image2,$image,0,0,0,0,$hauteur2,$largeur2,$taille[0],$taille[1]);
imagejpeg($image2);
?>
Vala...
cs_fab512 Messages postés 31 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 29 juin 2007
7 juil. 2004 à 15:51
pour ma part, j'utilise ça :
Pour que l'image $addr rentre dans le rectangle de dimension $hauteur, $largeur, en touchant au moins un des bords
<? $image=imagecreatefromjpeg($addr);
$taille=getimagesize($addr);
$ratio=$taille[0]/$taille[1];
if($ratio>1)
{$largeur2=$largeur;
$hauteur2=$largeur/$ratio;}
else
{$hauteur2=$hauteur;
$largeur2=$hauteur/$ratio;}
$image2=imagecreate($largeur2,$hauteur2);
imagecopyresized($image2,$image,0,0,0,0,$largeur2,$hauteur2,$taille[0],$taille[1]);
imagejpeg($image2); ?>
ça tiens en 15 lignes... pourquoi faire une boucle ?
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
20 avril 2004 à 16:32
Naixn, t'as raison, je n'avais pas du tout pensé à ce cas de figure :)
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
19 avril 2004 à 20:59
Mmmgh ... Un grand merci pour cette source qui m'a été utile.
par contre, j'ai eu un problème parceque moi je n'avais pas qu'un seul sous dossier, et ton script n'est fait pour en gérer qu'un car :

> substr($img,strpos($img,'/') + 1)
--> Va chercher la première occurence de "/".

Je te conseille plutôt de metre :

> substr(strrchr($img, "/"), 1)
--> qui va chercher la derniève occurence de "/" et donc supprimer tous le chemin à l'image :)

En tout cas encore merci pour lsa source :)
yakou32 Messages postés 32 Date d'inscription dimanche 14 mars 2004 Statut Membre Dernière intervention 3 avril 2015
14 mars 2004 à 13:56
Excusez-moi, je suis un peu neuneu et je débute... J'aimerais modifier le répertoire de destination des images... Je tente ce code, mais ça ne fonctionne pas (aucun message d'erreur ni de création de miniature...)

<?php
$DestinationFolder = "../image-bdd/";
$img = $row_LastPhoto['file'];
$maxX = 1000;
$maxY = 750;

function MakeThumb($img,$maxX,$maxY) {

// Récupération des infos sur l'image
$TImage = getimagesize($DestinationFolder.$img);
// Rapport initial: aucune réduction
$rapport = 1;

// Si la largeur de l'image est supérieure à la limite
if ($TImage[0] > $maxX)
// Tant que la largeur réduite est supérieure à la limite
while ($TImage[0] / $rapport > $maxX)
// Augmentation de la réduction
$rapport = $rapport + 0.5;

// Assignation de la largeur finale
$xF = $TImage[0] / $rapport;

// Si la hauteur de l'image est supérieure à la limite
// Si non, le rapport est le même que celui utilisé pour la largeur
if ($TImage[1] > $maxY)
// Tant que la hauteur réduite est supérieure à la limite
while ($TImage[1] / $rapport > $maxY)
// Augmentation de la réduction
$rapport = $rapport + 0.5;

// Assignation de la hauteur finale
$yF = $TImage[1] / $rapport;

// Récupération du handle de l'image selon son format
switch($TImage[2]) {

case 1:
$imageF = imagecreatefromgif($DestinationFolder.$img);
break;

case 2:
$imageF = imagecreatefromjpeg($DestinationFolder.$img);
break;

case 3:
$imageF = imagecreatefrompng($DestinationFolder.$img);
break;
}

// Création de la miniature
$thumbF = imagecreatetruecolor($xF,$yF);

// Compatibilité: imagecopyresized($thumbF,$imageF,0,0,0,0,$xF,$yF,$TImage[0],$TImage[1]);
imagecopyresampled($thumbF,$imageF,0,0,0,0,$xF,$yF,$TImage[0],$TImage[1]);

// Envoie de l'image au navigateur selon son format
switch($TImage[2]) {

case 1:
imagegif($thumbF,'../image-bdd/maxi_'.substr($img,strpos($img,'/') + 1), 60);
break;

case 2:
imagejpeg($thumbF,'../image-bdd/maxi_'.substr($img,strpos($img,'/') + 1), 60);
break;

case 3:
imagepng($thumbF,'../image-bdd/maxi_'.substr($img,strpos($img,'/') + 1), 60);
break;
}

// Libération de la mémoire
imagedestroy($thumbF);
imagedestroy($imageF);
}
?>
<?php
unlink("../image-bdd/".$row_LastPhoto['file']);
echo "l'image a originale a été effacée.";
?>
sepultura666 Messages postés 7 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 16 octobre 2006
22 févr. 2004 à 10:26
Autre truc, le PNG c'est chiant parceque quand tu te sert de la lib php pour créer les fichiers PNG, ben elle détruit la couche alpha, ce qui est génant parfois, et pour le gif c'est aussi des redimentionnement merdiques et de très mauvaise qulaitée, franchement mieux vaut rester sur du JPG...

pour un exemple de galerie, http://www.sepu-design.com/

allez dans la partie productions

voili voilou
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
21 févr. 2004 à 21:25
Intéressant ;p
sepultura666 Messages postés 7 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 16 octobre 2006
21 févr. 2004 à 21:20
C'est parceque si dans MATRIX tu met d'autre variables en PLUS ben la boucle va automatiquement faire tout les redimentionnement successifs pour y arriver, genre tu veux que quand tu envoye une image en 1280*960 par exemple tu veux conserver une image de 1024x768, une de 800x600 une de 640x480 une de 160x120 et une de 80x60, pour quelles raisons je sais pas mais tu veux le faire... ;-P ben tu met simplement :
$matrix_redim = array ("1024","768","800","600","640","480","160","120","80","60");

et le tour est joué, dans ce cas là tout les redimentionnements vont êtres faits, et l'image en 1280x960 supprimée d'elle même, en plus les images crées auront en extension "_$taille".

voilà le pourquoi du comment... lol
jeepnet Messages postés 2 Date d'inscription jeudi 19 février 2004 Statut Membre Dernière intervention 13 juin 2005
21 févr. 2004 à 15:28
Très bon source, ceci dit, ta premiere boucle pour le rapport bof:
pk tu n'a pas fait ca?
// Si la largeur de l'image est supérieure à la limite
if ($TImage[0] > $maxX)
$rapport = $TImage[0] / $maxX;

Enfin merci qd meme.
sepultura666 Messages postés 7 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 16 octobre 2006
16 févr. 2004 à 12:34
Moi j'utilise çà :

$original_size = getimagesize($_FILES['image']['tmp_name']);
$original_larg = $original_size[0];
$original_haut = $original_size[1];

echo "largeur : $original_larg
";
echo "longueur : $original_haut
";


$acceptedTypes = array('image/jpeg', 'image/jpg', 'image/pjpeg');
if(!in_array($_FILES['image']['type'], $acceptedTypes) || trim($_FILES['image']['tmp_name']) == "" || trim($_FILES['image']['tmp_name']) =="none")
{
echo "format image non valide, image jpeg seulement";
}
else
{ echo "
format valide
";


$nom_fichier = explode(".", $_FILES['image']['name']);
$nom = str_replace(' ', '_', $nom_fichier[0]);

$img_original = ImageCreateFromJpeg($_FILES['image']['tmp_name']);
$matrix_redim = array ("640","480","160","120");
$nbr = count ($matrix_redim) / 2;

for ($idx = 0; $idx < $nbr; ++$idx)
{
$IMG_LARG = $matrix_redim[$idx*2];
$IMG_HAUT = $matrix_redim[$idx*2+1];

if($original_larg <= $IMG_LARG && $original_haut <= $IMG_HAUT)
{
echo "
l'image n'a pas besoin d'être redimensionnée en $IMG_LARG*$IMG_HAUT";

$img_renamed = "../../imagesprod/$nom" . "_$IMG_LARG.jpg";
ImageJPEG($img_original, $img_renamed);
} else {


$ratio_v = $IMG_LARG / $original_larg;
$ratio_h = $IMG_HAUT / $original_haut;
$ratio = $ratio_v < $ratio_h ? $ratio_v:$ratio_h;
$img_new_larg = round($original_larg * $ratio);
$img_new_haut = round($original_haut * $ratio);

echo "
redimensionnement en $IMG_LARG*$IMG_HAUT... après redimensionnement : largeur $img_new_larg ; longueur $img_new_haut
";

$img_resized = imagecreatetruecolor($img_new_larg, $img_new_haut);
imagecopyresampled($img_resized, ImageCreateFromJpeg($_FILES['image']['tmp_name']), 0 , 0 , 0 , 0, $img_new_larg, $img_new_haut, $original_larg, $original_haut);


$nom_imag = "$nom"."_$IMG_LARG.jpg";
Imagejpeg($img_resized, "../../imagesprod/$nom_imag");
ImageDestroy($img_resized);
$img_new_size = filesize("../../imagesprod/$nom_imag");


echo "nom de l'image : $nom_imag
poids de la nouvelle image : $img_new_size octets
lien vers la nouvelle image
"; }
}
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
11 févr. 2004 à 16:21
jerome_, tu as tout compris :) La boucle permet de remplir au mieux l'espace dédié à la miniature, par contre, en mettant directement les limites comme dimensions, les proportions ne seraient pas respectées du tout !

Pour ce qui est des PNG, chez moi je n'ai aucun problème ! Version de GD: 2.0.15
Tu as sûrment raison, ça doit venir de la transparence mais je n'en sais pas plus...

Pour les GIF, j'ai finalement retiré ce format pour l'upload d'image.
Trop chiant à mettre en oeuvre, théoriquement ma fonction devrait fonctionner mais depuis la version 1.5 (je crois), le GIF n'est plus supporté par GD à cause des droits etc...
En plus, lorsqu'on travaille avec un GIF animé....bon courage ! ;)
jerome_ Messages postés 10 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 13 août 2010
11 févr. 2004 à 11:36
Merci pour l'algo ca m'a donné un bon début pour commencer ;)


Par contre je comprend pas pourquoi tu fais unwhile pour trouver ton rapport de réduction.

tu fais:

imagecopyresampled($thumbF,$imageF,0,0,0,0,$xF,$yF,$TImage[0],$TImage[1]);


mais ceci fais pareil non?:

imagecopyresampled($thumbF,$imageF,0,0,0,0,$maxX,$maxY,$TImage[0],$TImage[1]);

en fait ton while sert a te rapprocher de la taille maximale mais donc tu n'atteitn pas exactement la taille maxi précise. En gros ton $xF $maxX, et $yF $maxY.

Autre question plus importante, j utilise ton test pour voir si l image traitée est une Gif, Jpeg ou Png, mais dans le cas des gif et png, apres le traitement le fond de l image apparait noir, je crois que ca doit venir d un problème de transparence, pourrais tu m'aiguiller sur ce problème?

De plus j'arrive pas a afficher les images Gif si je fais un "imagegif()" pourtant j ai biens fais un "imagecreatefromgif()", par contre si je remplace le "imagegif()" par "imagejpg()" ca arrive a l'afficher.

l'"imagepng()" marche mais si je met "imagejpeg()" a la place ca donne le meme résultat.
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
10 févr. 2004 à 18:00
psyjc, oui le rapport hauteur/largeur n'est pas vraiment respecté, c'est vrai, car pour mon utilisation les dimensions limites sont de 200*150 ça ressemble drôlement à un carré ;)
Et comme je ne souhaite pas faire des miniatures vraiment toutes petites (ex: 70*120)...

Ma fonction convient à mes besoins, à vous de la personnaliser :p
bonjovi51 Messages postés 51 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 14 décembre 2006
10 févr. 2004 à 16:15
Marche pas ton lien !!
bonjovi51 Messages postés 51 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 14 décembre 2006
10 févr. 2004 à 13:53
Je te remercie pour les précisions. Si je vois une erreur, je l'annonce !!
psyjc Messages postés 182 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 18 avril 2008
10 févr. 2004 à 13:39
pour celle que jai donné, a la base elle fonctionne pour GD1.x et GD2
seulement pour l'exemple ci dessus, jai epuré juste au nessaissaire (en gardant uniquement pour GD2)
la version complete du script est a l'adresse que jai donné en demo, il faut le telecharger.
le reel probleme est quil est difficile de reperer automatiquement sur un serveur si il utilise GD1.x ou GD2 sans provoquer d'erreur!
bonjovi51 Messages postés 51 Date d'inscription vendredi 24 janvier 2003 Statut Membre Dernière intervention 14 décembre 2006
10 févr. 2004 à 12:29
Est ce que toutes versions de GD supportent cette version? Je sais que beaucoup d'hébergeur utilise la version 1.6 et que les fonctions que vous créez sont pour les version 2.0 ou +.

Ce serait bien d'adapter les fonctions pour toutes les versions.....

@+ et merci d'ajouter des fonctions qui sont utiles pour nous autres....
psyjc Messages postés 182 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 18 avril 2008
10 févr. 2004 à 10:52
hum
le rapport hauteur/largeur ne semble pas etre conservé!


j'utilise ca:


$IMAGE_TN_SIZE = 80 // Taille maximal a ne pas depassé (largeur ou hauteur)

$handle = @imagecreatefromjpeg($relatif_link);
$x=imagesx($handle);
$y=imagesy($handle);
//echo "X:$x | Y:$y
";
# 100
if($x>$y){ # |-------------|
$max=$x; # +-------------+ - -
$min=$y; # | | |
} # | | |
if($x<=$y){ # | img | |100
$max=$y; # | | |
$min=$x; # | | |
} # +-------------+ - -

if($max==$x){
$qq=$max/$IMAGE_TN_SIZE;
}

if($max==$y){
$qq=$max/$IMAGE_TN_SIZE;
}

$dest_x=$x/$qq;
$dest_y=$y/$qq;


if($dest_x > $x) {
$dest_x = $x;
$dest_y = $y;
}


$dst_img = imageCreatetruecolor($dest_x,$dest_y);


imagecopyresized($dst_img, $handle, 0, 0, 0, 0,$dest_x, $dest_y, $x, $y);

imagejpeg($dst_img,'', $IMAGE_TN_COMPRESSION);
imagedestroy($handle);
imagedestroy($dst_img);

qui marche impec : demo ici : http://jcjcjcjc.free.fr/server/
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
9 févr. 2004 à 19:28
Y a pas de soucis ;p
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
9 févr. 2004 à 19:27
Désolé j'ai pas regardé le code en détail mais juste le texte : "Je cherchais à faire des miniatures devant être affichées dans des tableaux, donc elles ne devaient pas dépasser X pixel de largeur et Y de hauteur."

C'est pour ça je n'ai pas approfondi. Tu réduis la taille de l'image et ensuite tu la redimensionnes. Ok Ok

a +
pyroflo Messages postés 323 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 17 mai 2005
9 févr. 2004 à 19:22
Salut,

tu ne crées pas de miniature, tu modifies seulement l'affichage dans le tag donc l'image est chargée entièrement même si tu l'affiches 6 fois plus petite...

Tu vois le truc ?

Imagines une galerie de 20 * 20ko !
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
9 févr. 2004 à 19:13
Salut !

Voici le code que j'utilise pour mon site :


$image="photos/1.jpg"; //EXEMPLE D'IMAGE
if (file_exists($image))
{
list($width, $height, $type, $attr) = getimagesize("$image");
if (($width)>100) //SI L'IMAGE FAIT PLUS DE 100PX de LARGE
{
$contenu.='
';
}
else
{
$contenu.='
';
}
}


Facile ensuite de le transformer en fonction

a +
Rejoignez-nous