echantillionage photo

Eléphant du PHP | 388 Messages

11 avr. 2010, 09:42

bonjour a tous,

dans mon site les personnes remplissent un formulaire et peuvent joindre une photo, celle ci j'uploade dans un dossier image en taille réel et le lien est mentionner dans une base sql.

Je fait appelle a c'est photo en miniature sous forme de galerie cependant quand elle se mettent en miniature elles mettent du temps a charger sachant que la taille se reduit en fonction de la taille original.

J'aurai voulu savoir si il était possible lorsque je fait appelle au miniature via un script php que les photos se chargent en baissant la qualité.
Ainsi celle ci se chargerai beaucoup plus vite.

Est ce possible ? quel méthode je doit utiliser en restant en php ?
quel fonction peut faire cela ?

Merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 avr. 2010, 10:53

Effectivement, lorsque tu affiches ta miniature en spécifiant une taille en html, c'est l'image d'origine qui est envoyée et c'est uniquement à l'affichage qu'elle apparait réduite.

Pour éviter cela, tu peux effectivement créer des miniatures avec php en utilisant la fonciton imagecopyresized().

Cependant, je ne suis pas certain qu'il soit judicieux de l'appeler à chaque fois qu'un utilisateur affiche une galerie. Le temps de chargement que tu gagnes en envoyant des photos plus légères va être perdu par le temps que php va mettre à les transformer.
Tu as sans doute intérêt à générer la miniature sur le serveur lors de l'upload afin d'avoir les deux images à disposition. Tu pourras alors afficher la miniature dans ta galerie et l'originale uniquement à la demande :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 388 Messages

11 avr. 2010, 13:03

merci pour ta réponse donc en plus dans ma table faudrait que je mettent un champs suplémentaire nommé miniature pour que le chemin si place.

cela fairai :
ID:1
nom:test
image:Image/test.jpg
miniature:image/miniature/test.jpg

voici le code php d'ajout du formulaire avec photo
<?php
// Fonction pour parser les variables vers FLASH
function Parse($variable,$valeur) {
echo "&" . $variable . "=" . utf8_encode($valeur);
}

if (!empty($_POST) && $_POST['MDP'] == $_POST['MDPBIS']) {

  // traitement
$categorie=$_POST['categorie'];
$typeannonce=$_POST['typeannonce'];
$souscategorie=$_POST['souscategorie'];
$titreannonce=$_POST['titreannonce'];
$descriptionannonce=$_POST['descriptionannonce'];
$prix=$_POST['prix'];

$departement=$_POST['departement'];
$region=$_POST['region'];

$NOMUTILISATEURS=$_POST['NOMUTILISATEURS'];
$MAILUTILISATEURS=$_POST['MAILUTILISATEURS'];
$MDP=$_POST['MDP'];
$MDPBIS=$_POST['MDPBIS'];
$TELEPHONE=$_POST['TELEPHONE'];

$dossier = 'Images/';
$maxsize = '1048576';
$maxwidth = '2000';
$maxheight = '2000';
//ici on commence avec les requêtes MySQL pour vérifier dans la table

include ('connect.php');//ici on inclut le fichier avec l'accès MySQL.
$crypt=md5($MDP);

$sql = "SELECT * FROM utilisateurs WHERE MAILUTILISATEURS = '$MAILUTILISATEURS'";//On sélectionne dans la table "UTILISATEUR" le login qui a pour valeur la variable "$login"
    $req = mysql_query($sql)or die(mysql_error());  
    $result = mysql_numrows($req);// on compte le nombre de résultats

    if($result!=0)  // le login existe déjà
        {
        Parse("resultat","email '$MAILUTILISATEURS' existe deja, desole"); //alors on renvoi au Flash que le login '$MAILUTILISATEURS' existe déjà
        }
    else  //sinon le login n'existe pas  
        {
       
       if ($_FILES['icone']['error'] > 0)
        {
                echo 'Erreur lors du transfert';
        }
        else
        {
                if ($_FILES['icone']['size'] > $maxsize)
                {
                        echo 'Le fichier est trop gros';
                }
                else
                {
                        $extensions_valides = array('jpg','jpeg','gif','png');
                        $extension_upload = strtolower(  substr(  strrchr($_FILES['icone']['name'], '.'),1));
                       
                        if (in_array($extension_upload,$extensions_valides))
                        {
                                $image_sizes = getimagesize($_FILES['icone']['tmp_name']);
                               
                                if (!$image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight)
                                {
                                        echo 'Image trop grande';
                                }
                                elseif (file_exists($dossier . $_FILES['icone']['name']))
                                {
                                       echo 'Le nom de votre photo éxiste déjà merci de la renommer';
                                }
                                else
                                {
                                        $nom = "{$_FILES['icone']['name']}";
                                        $resultat = move_uploaded_file($_FILES['icone']['tmp_name'],$dossier.$nom);     if ($resultat) {
                                                echo 'Transfert réussi';
                                               
        $sql = "INSERT INTO utilisateurs (NOMUTILISATEURS,MAILUTILISATEURS,MDP,TELEPHONE) VALUES ('$NOMUTILISATEURS','$MAILUTILISATEURS','$crypt','$TELEPHONE')"; //Alors on insert dans la table le nouvel utilisateur        
                mysql_query ($sql);
                $NUMUTILISATEURS=mysql_insert_id();
                        $sql2 = "INSERT INTO annonces (categorie,typeannonce,souscategorie,titreannonce,descriptionannonce,prix,date,departement,region,NUMUTILISATEURS) VALUES ('$categorie','$typeannonce','$souscategorie','$titreannonce','$descriptionannonce','$prix','".date("Y-m-d H:i:s")."','$departement','$region','$NUMUTILISATEURS')";
                        $req = mysql_query($sql2)or die(mysql_error());                        

                                                $nom = mysql_real_escape_string($nom);
                        $image = $dossier.$nom;
                        $description = mysql_real_escape_string($_POST['description']);
                $numannonce=mysql_insert_id();                               
                        mysql_query("INSERT INTO images VALUES('','" . $nom . "', '" . $description. "', '" . $image . "', '" . $numannonce . "')");

        Parse("resultat","merci $MAILUTILISATEURS, vous etes a present enregistre et votre annonce est enregistré");

                                        }
                                        else
                                        {
                                                echo 'Echec du transfert';
                                        }
                                }
                                                                             
                        }
                        else
                        {
                                echo 'Extension incorect';
                        }
                }
        }            
      }
}
elseif (!empty($_POST))
{
  echo 'Le Mot de passe est different du premier.';
}      

?>
Et dans mon code comment utiliser la fonction imagecopyresized() pour qu'il recopie dans le dossier miniature car je doit utiliser cela
<?php
// Fichier et nouvelle taille
$filename = '$nom';
$width=50px;
$height=50px;

// Content type
header('Content-type: image/miniature/jpeg');

// Calcul des nouvelles dimensions
list($width, $height) = getimagesize($filename);


// Chargement
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Redimensionnement
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Affichage
imagejpeg($thumb);
?>


Eléphant du PHP | 109 Messages

11 avr. 2010, 13:29

Bonjour,

en survolant ton premier bloc de code, j'ai vu une chose qui m'a sauté aux yeux :
$result = mysql_numrows($req);
Remplace le plutôt par :
$result = mysql_num_rows($req);
Car mysql_numrows est obsolète.
Et dans mon code comment utiliser la fonction imagecopyresized() pour qu'il recopie dans le dossier miniature car je doit utiliser cela
Tu dois ajouter un argument à la fonction suivante avec le chemin et le nom de la miniature pour l'enregistrer :
imagejpeg($thumb, 'tonDossier/TonImage.jpg');
Si tu veux, tu peux même mettre un troisième argument INT pour la qualité de la miniature. (de 0 à 100)

Bonne journée ;)
ANSI <font> <font> <font> <li> <p> <title> Mar I/O .NET

Eléphant du PHP | 388 Messages

12 avr. 2010, 18:06

Faut que je reprenne a zéro car je m'embrouille un peu :D

j'ai deux tables
une annonce comprenant les champs numannonce,titre,descriptif,numutilisateurs
en clé etrangére numutiilsateur
une images comprenant les champs ID,nomimage,liensimages,numannonce
en clé étrangére numannonce.

Je ne voit pas du tout comment afficher les annonces avec leur image correspondante.

sachant que pour afficher les annonces j'utilise ce sript.
<?php
$sql= 'SELECT * FROM annonces';
$req= mysql_query($sql) or die ('erreur sql §<br />'.$sql.'<br />'.mysql_error());

//Ta boucle
while($data=mysql_fetch_array($req)) 
  { // ici la boucle qui permet d'effectuer la recherche 
  ?>
  <tr>
    <td><?php echo $data ['departement']; ?></td>
	<td><?php echo $data ['region']; ?></td>
	<td><?php echo $data ['categorie']; ?></td>
	<td><?php echo $data ['souscategorie']; ?></td>	
    <td><?php echo $data ['typeannonce']; ?></td>
	<td><?php echo $data ['titreannonce']; ?></td>
    <td><?php echo $data ['descriptionannonce']; ?></td>
	<td><?php echo $data ['prix'].'<br /><br />'; ?></td>
	

   
  
  </tr>
    
<?php
  }
 mysql_free_result ($req);
mysql_close ();
  ?>
 
<?php
et pour apercevoir les images sous formes de galerie j'ai se script
<html>
<head>
<title>Ma galerie</title>
</head>

<body>
<?php
// cette portion à déjà été détaillé
$tableau = array();
$dossier = opendir ('./php/Images/');
while ($fichier = readdir ($dossier)) {
	if ($fichier != '.' && $fichier != '..' && $fichier != 'index.php') {
		$tableau[] = $fichier;
	}
}
closedir ($dossier);

$nbcol=5;
$nbpics = count($tableau);

if ($nbpics != 0) {
	echo '<table>';
	for ($i=0; $i<$nbpics; $i++){
		if($i%$nbcol==0) echo '<tr>';
		// noter bien que l'on place un lien vers le fichier mini.php qui va générer nos miniatures. On ajoute un argument, le nom de fichier image à miniaturiser
		echo '<td><a href="php/Images/' , $tableau[$i] , '"><img src="mini.php?f=' , $tableau[$i] , '" alt="Image" /></a></td>';
		if($i%$nbcol==($nbcol-1)) echo '</tr>';
	}
	echo '</table>';
}
else echo 'Aucune image à afficher';
?>
</body>
</html>
Je souhaitera que l'annonce numéro 1 ai l'image associé a celui ci.

je pence a un

Code : Tout sélectionner

$sql = "SELECT * FROM images WHERE numannonce = '$numannonce'";
Pouvez vous m'aider svp car je bloc totalement deplus je ne voit pas du tout comment procéder
ou peut étre m'aiguiller :cry: merci d'avance

ViPHP
ViPHP | 5462 Messages

12 avr. 2010, 18:09

une jointure

Eléphant du PHP | 388 Messages

12 avr. 2010, 18:16

mais ma clé étrangére faisant la jointure est numannonce dans la table images

ViPHP
ViPHP | 5462 Messages

12 avr. 2010, 18:18

mais ma clé étrangére faisant la jointure est numannonce dans la table images
où est le problème ?

Eléphant du PHP | 388 Messages

12 avr. 2010, 18:20

mais ma clé étrangére faisant la jointure est numannonce dans la table images
où est le problème ?
je ne comprent pas trop là

ViPHP
ViPHP | 5462 Messages

12 avr. 2010, 18:22

tu sais faire une jointure ?

Eléphant du PHP | 388 Messages

12 avr. 2010, 18:25

justement j"en est jamais fait je suis entreint de regarder des tutos mais je pige pas le principe
jointure gauche ,droite .... #-o

un peut cela

SELECT `titre`, `descriptif`, `nomimage`, `lienimage`
FROM `annonces` AS a, `images` AS i
WHERE numannonce = numannonce;

non ?

ViPHP
AB
ViPHP | 5818 Messages

12 avr. 2010, 19:37

Il y a un tuto pour débutant sur les jointures ici et il y en d'autres sur phpdebutant.org
jointure gauche ou droite peu importe c'est par commodité de langage mais cela te donneras le même résultat.

Eléphant du PHP | 388 Messages

14 avr. 2010, 19:06

Bon déja merci a vous j'ai fait plein de test sur les jointure je comprend bien le fonctionnement.

Cepedant j'ai toujouts une petit soucis pour l'affichage de mon image.
J'ai mon fichier annonce qui doit afficher le titre des annonce, la description et les photos....

Voici mon script.
<?php

include 'php/connect.php';

$sql= 'SELECT `region`,`titreannonce`,`descriptionannonce`,`prix`,`date`,`image`
	   FROM `annonces` AS a,`images` AS i
	   WHERE a.numannonce = i.numannonce';
$req= mysql_query($sql) or die ('erreur sql §<br />'.$sql.'<br />'.mysql_error());

$tableau = array();

while($data=mysql_fetch_array($req))
	{
?>
<table>
	<tr>
	
		<?php echo '<td><a href="php/Images/' , $data['image'] , '"><img src="mini.php?f=' , $data['image'] , '" alt="$data['image']" /></a></td>';?>
		<td><?php echo $data ['departement']; ?></td>
		<td><?php echo $data ['region']; ?></td>
		<td><?php echo $data ['categorie']; ?></td>
		<td><?php echo $data ['souscategorie']; ?></td>	
		<td><?php echo $data ['typeannonce']; ?></td>
		<td><?php echo $data ['titreannonce']; ?></td>
		<td><?php echo $data ['descriptionannonce']; ?></td>
		<td><?php echo $data ['prix'].'<br /><br />'; ?></td>
	</tr>
 </table>
 
<?php
  }
 mysql_free_result ($req);
mysql_close ();
  ?>
Mais photo se miniaturise a la volet.
pour cela j'utilise se script ( mini.php )
<?php
// on défini notre ratio pour nos miniatures (CF. plus haut pour des explications
$ratio = 150;
// on défini le répertoire qui contient nos images de grande taille
$dir = './php/Images/';

// si aucune image n'est donnée en arguments, on redirige le visiteur vers l'accueil de la galerie
if (!isset($_GET['f'])) {
	header('location: galerie.php');
	exit();
}
else {
	// on récupère le nom de fichier à miniaturiser
	$image = $_GET['f'];
	// on récupère les infos de cette image
	$data = @getimagesize('./php/Images/'.$image);
	// si il ne s'agit pas d'un fichier image, on redirige le visiteur vers l'accueil de la galerie
	if ($data == FALSE) {
		header('location: galerie.php');
		exit();
	}
	else {
		// si notre image est de type jpeg
		if ($data[2] == 2) {
			// on crée une image à partir de notre grande image à l'aide de la librairie GD
			$src = imagecreatefromjpeg($dir.'/'.$image);
			// on teste si notre image est de type paysage ou portrait
			if ($data[0] > $data[1]) {
				$im = imagecreatetruecolor(round(($ratio/$data[1])*$data[0]), $ratio);
				imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$data[1])*$data[0]), $ratio, $data[0], $data[1]);
			}
			else {
				$im = imagecreatetruecolor($ratio, round(($ratio/$data[0])*$data[1]));
				imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($data[1]*($ratio/$data[0])), $data[0], $data[1]);
			}
			// contrairement au premier cas où l'on créait un fichier sur le disque dur, ici, comme on génère des images à la volée, on envoie un header au navigateur web du visiteur lui disant que le fichier mini.php va en fait générer une image de type jpeg, soit du type mime image/jpeg.
			header ("Content-type: image/jpeg");
			imagejpeg ($im);
		}
		elseif ($data[2] == 3) {
			$src = imagecreatefrompng($dir.'/'.$image);
			if ($data[0] > $data[1]) {
				$im = imagecreatetruecolor(round(($ratio/$data[1])*$data[0]), $ratio);
				imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$data[1])*$data[0]), $ratio, $data[0], $data[1]);
			}
			else {
				$im = imagecreatetruecolor($ratio, round(($ratio/$data[0])*$data[1]));
				imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($data[1]*($ratio/$data[0])), $data[0], $data[1]);
			}
			header ("Content-type: image/png");
			imagepng ($im);
		}
	}
}
?>
le problème c'est que mes images n'apparaisse pas a la place de l'image j'obtient $data[$image]

Pouvez m'aider et me dire se qui peut bloqué :( merci

ViPHP
AB
ViPHP | 5818 Messages

14 avr. 2010, 19:46

Utilises "LEFT JOIN" (dans ce cas) pour les jointures et gardes where pour les critères de sélection, c'est plus clair.

Par ailleurs je vois que tu veux afficher des champs comme par exemple "departement" mais où les as-tu sélectionnés dans ta requête ?

Les champs sélectionnés dans ton exemple sont `region`,`titreannonce`,`descriptionannonce`,`prix`,`date`,`image` ... et rien d'autre.

Il faut que tu travailles encore un peu avec les tutos, un autre ici

Eléphant du PHP | 388 Messages

14 avr. 2010, 19:58

Utilises "LEFT JOIN" (dans ce cas) pour les jointures et gardes where pour les critères de sélection, c'est plus clair.

Par ailleurs je vois que tu veux afficher des champs comme par exemple "departement" mais où les as-tu sélectionnés dans ta requête ?

Les champs sélectionnés dans ton exemple sont `region`,`titreannonce`,`descriptionannonce`,`prix`,`date`,`image` ... et rien d'autre.

Il faut que tu travailles encore un peu avec les tutos, un autre ici
Désolé une erreur de ma par voici le code modifié
<?php

include 'php/connect.php';

$sql= 'SELECT `region`,`titreannonce`,`descriptionannonce`,`prix`,`date`,`image`
	   FROM `annonces` AS a,`images` AS i
	   WHERE a.numannonce = i.numannonce';
$req= mysql_query($sql) or die ('erreur sql §<br />'.$sql.'<br />'.mysql_error());

$tableau = array();


while($data=mysql_fetch_array($req))
	{
?>
<table>
	<tr>
	
		<?php echo '<td><a href="php/Images/' , $data['image'] , '"><img src="mini.php?f=' , $data['image'] , '" alt="Image" /></a></td>'; ?>
		 
		
		<td><?php echo $data ['region']; ?></td>		
		<td><?php echo $data ['titreannonce']; ?></td>
		<td><?php echo $data ['descriptionannonce']; ?></td>
		<td><?php echo $data ['prix'].'<br /><br />'; ?></td>
	</tr>
 </table>
 
<?php
  }
 mysql_free_result ($req);
mysql_close ();
  ?>

	


Mais toujours impossible d'afficher l'image cela bloc a se niveau là
<?php echo '<td><a href="php/Images/' , $data['image'] , '"><img src="mini.php?f=' , $data['image'] , '" alt="Image" /></a></td>'; ?>
je pense ou dans mon fichier mini car j'ai essayer cela
echo '<a href="apercu.php?id_img='.$data[image].'"><img src="php/'.$data[image].'" alt="'.$data[image].'" title="'.$data[image].'" WIDTH=100 HEIGHT=100 /></a>';
Et la sa marche mais cette méthode m'intéresse pas car les photos gardent leur poids d'origine et ne sont pas redimensionnées en miniature c'est pour cela qu'il y a le script mini
mais sa bloc