[IMAGE] miniature

Le
erwinol
Salut à vous ! :)

J'ai un formulaire qui permet d'uploader jusqu'à 5 images en même temps et
la fonction upload_images() qui permet de le faire jusque là tout va
bien.

for($i=0 ; $images[$i]!="" ; $i++)
{
if(getImageSize($images[$i])) // si c'est une image
{
// destination : chemin final de l'image + nom du fichier avec extension
$extension = get_extension($_FILES['images']['name'][$i]);
$img_dest[$i] = $upload_images . $id_article . "_" . $i . "." .
$extension;

// on a tous les éléments donc on déplace l'image
move_uploaded_file($_FILES['images']['tmp_name'][$i] , $img_dest[$i])
or die("Erreur à l'upload de l'image ".$i);
}
}

Là où je coince c'est que je voudrais créer une miniature de la première des
images uploadées, cette miniature me servira de lien vers l'ensemble des 5
images (ou 4 ou 3 ).

J'ai cherché des tutos sur internet mais ils sont tjs très vagues. Je
voudrais que le plus grand des 2 cotés (longueur et largeur) soit 80px et
que l'autre s'ajuste automatiquement pour conserver les proportions de
l'image. Quelle est la meilleure solution ? Que dois-je ajouter à ma
fonction ci-dessus ?

Merci d'avance pour votre aide.

Erwin
--
Ce message a été envoyé depuis http://newsgroup.codes-sources.com/
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Salagir
Le #132293
On 15 Jul 2003 08:35:49 GMT, in fr.comp.lang.php,
erwinol wrote:
Là où je coince c'est que je voudrais créer une miniature de la première des
images uploadées
voudrais que le plus grand des 2 cotés (longueur et largeur) soit 80px et


Version courte (sous unix avec imagemagick installé):

[d'abord, sauver l'image à réduire sur le disque sous le nom de
img_uploaded.whatever (tous formats acceptés sauf peut etre le gif.]

system('convert "img_uploaded.whatever" -resize "80x80>" +profile "*" "miniature.jpg"');

[voilà, un miniature.jpg de toute beauté est créé]


Version longue (avec l'imglib de php [résultats moins beau]):
(ne marche pas avec les gifs et autres formats non gérés par l'imglib)

<?php

//NOTE: $nomimg est le nom de l'image uploadée
//NOTE2: ceci est initialement le code d'une fonction membre de classe,
// d'ou les $this->maxX et $this->maxY, ici égaux à 80.

//chopper l'etension
$table = explode('.', $nomimg);
$extension = $table[ count($table)-1 ];

//génèse de la miniature
switch(strtolower($extension)) {
case 'jpg' : case 'jpeg' : case 'jpe' :
$source = imagecreatefromjpeg($nomimg); break;
case 'png' : $source = imagecreatefrompng($nomimg); break;
case 'bmp' : $source = imagecreatefromwbmp($nomimg); break;
default :
return ' }
if (!$source) return; //Ca ne devrai jamais etre comme ca mais au cas ou...
$destX = imageSX($source);
$destY = imageSY($source);
$ratio = $destY / $destX;
if ($destX > $this->maxX) {
$destX = $this->maxX;
$destY = $destX * $ratio;
$shrink=1;
}
if ($destY > $this->maxY) {
$destY = $this->maxY;
$destX = $destY / $ratio;
$shrink=1;
}
//rétréci
if ($shrink) {
$destination = imagecreate($destX, $destY);
imagecopyresized($destination, $source,
0, 0, 0, 0,
$destX, $destY, imageSX($source), imageSY($source));
imagejpeg($destination, $nom_minia, 75); // le 75 c'est la qualité.
}
else copy($nomimg, $nom_minia);
return "<img src="$nom_minia">";
}

?>

--
++++++++ Zelda, Dragon Ball, Mana and my (art)work at www.salagir.com ++++++++
For I am Xander, King of Cretins. May all lesser cretins bow before me.
-+- Xander in Buffy The Vampire Slayer, 1x03 - It's still power -+-

Damien Accorsi
Le #132062
erwinol wrote:
Salut à vous ! :)

J'ai un formulaire qui permet d'uploader jusqu'à 5 images en même temps et
la fonction upload_images() qui permet de le faire ... jusque là tout va
bien.

Là où je coince c'est que je voudrais créer une miniature de la première des
images uploadées, cette miniature me servira de lien vers l'ensemble des 5
images (ou 4 ou 3 ...).

J'ai cherché des tutos sur internet mais ils sont tjs très vagues. Je
voudrais que le plus grand des 2 cotés (longueur et largeur) soit 80px et
que l'autre s'ajuste automatiquement pour conserver les proportions de
l'image. Quelle est la meilleure solution ? Que dois-je ajouter à ma
fonction ci-dessus ?

Merci d'avance pour votre aide.

Erwin


Salut,

j'ai développé un petit outil ci-joint qui liste tous les fichiers d'un
répertoire et qui génère automatiquement les miniatures dans le
répertoire paramétré. En fait, ce qui t'intéressera sûrement, c'est la
fonction "miniature" qui génère la miniature avec le taux de réduction
passé en paramètre.

Si tu préfères générer des miniatures aux dimensions déterminées, il te
suffira de remplacer le paramètre "$taux_reduc" par une largeur ou
hauteur définie puis de modifier les formules de calcul des dimensions
de la miniature :

$taille_x = (int) ( ImageSX ( $img_in ) * $taux_reduc );
$taille_y = (int) ( ImageSY ( $img_in ) * $taux_reduc );

(en fait, dans ces 2 formules, on récupère la largeur et la hauteur de
l'image d'origine "ImageSX ( $img_in )" et on multiplie ça par le taux
de réduction, qu'on converti en entier).

Pour info, j'ai un appareil photo numérique, et j'utilise ce script pour
générer systématiquement des miniatures et des photos à un format déterminé.


ci-dessous mon script :

<?

// exécution réelle
$rep_original = "original";
$rep_photos = "photos";
$rep_minia = "vignettes";
echo "<hr>n";
if ( $action == "photos" ){
automatise ( $rep_original, $rep_photos, 0.5 );
}
elseif ( $action == "vignettes" ) {
automatise ( $rep_original, $rep_minia, 0.1 );
}
else {
echo "rien à faire...";
}

// TOUTES LES FONCTIONS UTILES SONT CI-DESSOUS

// fonction de redimensionnement d'images JPG
function miniature ($img_ori, $img_dest, $rep_dest, $taux_reduc) {

//import de l'image et mise en mémoire
$img_in = ImageCreateFromJpeg ( "./$rep_ori/$img_ori" );
// calcul des dimensions de la miniature
$taille_x = (int) ( ImageSX ( $img_in ) * $taux_reduc );
$taille_y = (int) ( ImageSY ( $img_in ) * $taux_reduc );
$img_out = ImageCreate ( $taille_x, $taille_y ) ;
ImageCopyResized ( $img_out, $img_in, 0, 0, 0, 0, $taille_x,
$taille_y, ImageSX($img_in), ImageSY($img_in) );
if ( ImageJPEG ( $img_out, "$rep_dest/$img_dest" ) ) {
$statut = 1;
}
else {
$statut = 0;
}

if ( $statut == 1 ) {
echo "Redimensionnement de $taux_reduc effectué.<br>n";
}
else {
echo "Un problème est intervenu, la miniature n'a pas été
créée.<br>n";
}
ImageDestroy ( $img_in );
ImageDestroy ( $img_out );

return $statut;
}

// programme principal : on liste tous les fichiers du répertoire d'origine
// et on génère la miniature pour chaque fichier trouvé
// Attention le type de fichier n'est pas testé !!!

function automatise ( $rep_ori, $rep_dest, $taux ) {
echo "<b>traitement : <i>$rep_ori -> $rep_dest @ $taux</i></b><br>n";
// on liste tous les fichiers du répertoire
// on ne prend pas en compte le "." et ".."
$i=0;
$rep=opendir ("$rep_ori");
while ( $fichier=readdir($rep) ) {
if ( filetype("$rep_ori/$fichier")=="file" ) {
$image[$i]=$fichier;
$i++;
}
}

// on exécute ensuite la miniaturisation
$max=$i;
for ($i=0; $i<$max; $i++) {
echo "* ".$image[$i]." en cours...<br>n";
miniature ( $rep_ori."/".$image[$i], $image[$i], $rep_dest, $taux );
}
echo "<hr>nn";
}



?>

Poster une réponse
Anonyme