echantillionage photo

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : echantillionage photo

Re: echantillionage photo

par AB » 20 avr. 2010, 02:28

Ben oui tu dois avoir une variable spécifique pour le chemin qui indique les répertoires et une autre pour indiquer le nom de l'image (ou image + répertoire) qui sera enregistrée en bdd...

Re: echantillionage photo

par spidercrash » 19 avr. 2010, 18:01

donc cela fonctionne avec se script
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 90;

//recuperation du post du formulaire
if (isset($_POST['ok'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
			else {
			
			
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur 			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}

	
		else {
		

		
			if ($tableau[2] == 2) {
				
				if (is_file('.pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];
				

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille 				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {
// on crée une image à partir de notre grande image à l'aide de la librairie GD 					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
// on teste si notre image est de type paysage ou portrait 					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					}
 // on copie notre fichier généré dans le répertoire des miniatures 					
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				
			
				}
mais le problème là j'utilise cela
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

le HIC si je le précente comme cela
$dir = "/pics";
$dir_mini = "/mini";

j'obtient se message

Warning: copy(/pics/IMG_0013.jpg) [function.copy]: failed to open stream: No such file or directory in /homez.316/logisdesq/www/php/mcpvalidationannonceparticulier.php on line 64

Warning: imagecreatefromjpeg(/pics/IMG_0013.jpg) [function.imagecreatefromjpeg]: failed to open stream: No such file or directory in /homez.316/logisdesq/www/php/mcpvalidationannonceparticulier.php on line 68

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /homez.316/logisdesq/www/php/mcpvalidationannonceparticulier.php on line 72

Warning: imagejpeg() [function.imagejpeg]: Unable to open '/mini/IMG_0013.jpg' for writing in /homez.316/logisdesq/www/php/mcpvalidationannonceparticulier.php on line 79

j'ai essayé plusieurs chose mais rien ne passe que en faisant
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

Puis j'ai voulu placé cela

Code : Tout sélectionner

if (file_exists($dir . $_FILES['mon_image']['name'])) { echo 'Le nom de votre photo éxiste déjà merci de la renommer'; }
Afin de faire un controle de doublons mais sa passe pas je ne voit pas ou je peut le placer

Re: echantillionage photo

par AB » 19 avr. 2010, 03:12

Sinon concernant la condition, si tu veux faire l'enregistrement en bdd si la miniature est créée tu peux faire
// A la place de imagejpeg  ($im, $dir_mini.'/'.$file_upload);
$test = imagejpeg  ($im, $dir_mini.'/'.$file_upload);

//Suite du code

if($test)
{
//requête d'insertion
}
Simplement parce que imagejpeg renvoie true en cas de succès sinon flase (comme l'indique le manuel).

Mais surtout n'oublies pas mon précédent message :wink:

Re: echantillionage photo

par AB » 19 avr. 2010, 03:01

Non non faut pas mettre le chemin complet dans ta base de donnée, car il va changer quand ce sera sur un serveur distant ou si tu change le nom de domaine par exemple. Mets uniquement le répertoire et le nom de l'image par exemple pics/IMG_0015.
Et encore le répertoire n'est pas indispensable puisqu'on peut le définir à la lecture. Par contre ce serait plus souple de laisser l'extension de l'image en bdd.

Re: echantillionage photo

par spidercrash » 18 avr. 2010, 08:19

donc j'ai fait cela
include ('connect.php');
			$nom = "{$_FILES['mon_image']['name']}";
			$image = $dir.$nom;
			$miniature = $dir_mini.$nom;
			$sql = "INSERT INTO images (image,miniature) VALUES ('$image','$miniature')";       
            $req = mysql_query($sql)or die(mysql_error());

			}
mais dans ma base le liens passe bien mais cela mais exemple

/homez.316/aaa/www/galerietest/picsIMG_0015

alors que sa devrait mettre
/homez.316/aaa/www/galerietest/pics/IMG_0015

Re: echantillionage photo

par spidercrash » 18 avr. 2010, 08:05

voici mon code complet de ma page de transfert.
<?php

print getcwd();

//dossier ou seront stocket les miniature et les images
$dir = getcwd()."/pics";
$dir_mini = getcwd()."/mini";

//taille des miniature
$ratio = 150;

//recuperation du post du formulaire
if (isset($_POST['go'])) {
// on teste si le champ permettant de soumettre un fichier est vide ou non
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
			else {
			
			
// on examine le fichier uploadé en récupérant de nombreuses informations sur ce fichier		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
// si le fichier uploadé n'est pas une image, on efface le fichier uploadé et on affiche un petit message d'erreur 			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}
		
		else {
			
			if ($tableau[2] == 2) {
				
				if (is_file('.pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];

// on copie le fichier que l'on vient d'uploader dans le répertoire des images de grande taille 				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {
// on crée une image à partir de notre grande image à l'aide de la librairie GD 					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
// on teste si notre image est de type paysage ou portrait 					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					}
 // on copie notre fichier généré dans le répertoire des miniatures 					
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				
			
				}
				
			

			}
			else {
// si notre image n'est pas de type jpeg				
				unlink($_FILES['mon_image']['tmp_name']);
				$erreur = 'Votre image est d\'un format non supporté.';
			}
		}
	}
}	


?>
maintenant je souhaiterai rajouter une condition si resultat = 1 soit le fichier transferer alors on copie les liens dans la table image mais je ne voit pas comment mettre cette condition

Re: echantillionage photo

par spidercrash » 18 avr. 2010, 08:02

mon problème est résolu c'était une faute de frappe dans le fichier index :D

Re: echantillionage photo

par AB » 16 avr. 2010, 16:08

Ben quand ça marche pas faut se mettre en mode debug...

Par exemple tu mets un echo 'condition 1 ok' juste après une condition pour voir si le code entre ou non dans la condition. Tu finiras bien par trouver l'origine du pb avec cette méthode. Fait aussi afficher tes variables pour voir ce qu'elles contiennent. Isoles certaines parties de ton code etc.

Re: echantillionage photo

par spidercrash » 16 avr. 2010, 07:27

donc j'ai suivi ton conseil je te remercie mais cela ne fonctionne toujours pas voici le code total
<?php
$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;

//Et si tu veux poster ton image dans un dossier nommé 'pics' situé à la racine de ton site ce sera donc

$dir = $real.'pics';
$dir_mini = $real.'mini';

$ratio = 150;

if (isset($_POST['go'])) {
	
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
	else {
		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}
		else {
			
			if ($tableau[2] == 2) {
				
				if (is_file('../pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];

				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {
					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					}
					
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				
				
				header('location: index.php');
				exit();
			}
			else {
				
				unlink($_FILES['mon_image']['tmp_name']);
				$erreur = 'Votre image est d\'un format non supporté.';
			}
		}
	}
}
?>

Re: echantillionage photo

par AB » 15 avr. 2010, 23:23

Une chose à savoir : dans ton code précédent (l'avant dernier) est indiqué des chemins de dossier en dur :
$dir = '../pics';
$dir_mini = '../mini';
Or il te faut indiquer l'adresse réelle du chemin de ton site par rapport au serveur et celle de ton dossier.

Pour connaitre l'adresse réelle de ton site tu peux faire :

$real = (substr($_SERVER['DOCUMENT_ROOT'],-1) == '/')? $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/' ;

//Et si tu veux poster ton image dans un dossier nommé 'pics' situé à la racine de ton site ce sera donc

$dir = $real.'pics';
Pareil pour $dir_mini

Re: echantillionage photo

par spidercrash » 15 avr. 2010, 20:42

javais déja vu le tuto complet mais se que je ne comprend pas c'est que je souhaiterai stoquer les images miniatures dans un dossier miniature et je ne voit pas du tout ou il stoque, et je ne voit pas non plus ou il stoque les image taille réel.
Car par la suite je lancerai l'enregistrement du liens des images dans ma table
<?php
if (!empty($_POST['InsererNews']))
{
        $ListeExtension = array('jpg' => 'image/jpeg', 'jpeg'=>'image/jpeg');
        $ListeExtensionIE = array('jpg' => 'image/pjpeg', 'jpeg'=>'image/pjpeg');
        if (!empty($_POST['TitreNews']) && (!empty($_FILES['ImageNews'])) && (!empty($_POST['ContenuNews'])))
        {
                $TitreNews = $_POST['TitreNews'];
                $ContenuNews = $_POST['ContenuNews'];
 
                if ($_FILES['ImageNews']['error'] <= 0)
                {
                        if ($_FILES['ImageNews']['size'] <= 2097152)
                        {
                            $ImageNews = $_FILES['ImageNews']['name'];
 
                            $ExtensionPresumee = explode('.', $ImageNews);
                            $ExtensionPresumee = strtolower($ExtensionPresumee[count($ExtensionPresumee)-1]);
                            if ($ExtensionPresumee == 'jpg' || $ExtensionPresumee == 'jpeg')
                            {
                              $ImageNews = getimagesize($_FILES['ImageNews']['tmp_name']);
                              if($ImageNews['mime'] == $ListeExtension[$ExtensionPresumee]  || $ImageNews['mime'] == $ListeExtensionIE[$ExtensionPresumee])
{
 
                                              $ImageChoisie = imagecreatefromjpeg($_FILES['ImageNews']['tmp_name']);
                                              $TailleImageChoisie = getimagesize($_FILES['ImageNews']['tmp_name']);
                                              $NouvelleLargeur = 350; //Largeur choisie à 350px mais modifiable
 
                                              $Reduction = ( ($NouvelleLargeur * 100)/$TailleImageChoisie[0] );
                                              $NouvelleHauteur = ( ($TailleImageChoisie[1] * $Reduction)/100 );
 
                                              $NouvelleImage = imagecreatetruecolor($NouvelleLargeur , $NouvelleHauteur) or die ("Erreur");
 
                                              imagecopyresampled($NouvelleImage , $ImageChoisie  , 0,0, 0,0, $NouvelleLargeur, $NouvelleHauteur, $TailleImageChoisie[0],$TailleImageChoisie[1]);
                                              imagedestroy($ImageChoisie);
                                              $NomImageChoisie = explode('.', $ImageNews);
                                              $NomImageExploitable = time();
                                              
                                              imagejpeg($NouvelleImage , 'imagesnews/'.$NomImageExploitable.'.'.$ExtensionPresumee, 100);
                                              $LienImageNews = 'imagesnews/'.$NomImageExploitable.'.'.$ExtensionPresumee;
 
                                              $sql= 'INSERT INTO votre_table VALUES ("", "'.$TitreNews.'", "'.$ContenuNews.'", "'.$LienImageNews.'", "'.time().'")';
                                              $res = mysql_query($sql) or die(mysql_error());
                                              if ($res)
                                              {
                                                      echo 'La news a bien été insérée';
                                              }
                                        }
                                        else
                                        {
                                                echo 'Le type MIME de l\'image n\'est pas bon';
                                        }
                                }
                                else
                                {
                                        echo 'L\'extension choisie pour l\'image est incorrecte';
                                }
                        }
                        else
                        {
                                echo 'L\'image est trop lourde';
                        }
                }
                else
                {
                        echo 'erreur lors de l\'upload image';
                }
        }
        else
        {
                echo 'Au moins un des champs est vide';
        }
}
?>

peut tu m'aider je souhaiterai rajouter ceci

$dir = '../pics';
$dir_mini = '../mini';
puis aprés je ne voit pas comment l'utiliser dans le code

En tout cas merci pour ton aide

Re: echantillionage photo

par AB » 15 avr. 2010, 19:51

IL y a un tuto rapide vers la fin de cette page et un autre plus complet ici

Re: echantillionage photo

par spidercrash » 15 avr. 2010, 18:32

Donc j'ai essayer de faire pour tester un form tout simple avec creation de miniature dans un dossier nommé mini et de mettre l'image taille reelle dans une dossier pics.
Le problème cela me donne rien du tout meme pas de message d'erreur rien et l'image se place pas dans les dossiers désirez pas d'upload je vois pas se qui peut bloquer.

Voici le fichier de transfert.
<form id="ok" method="post" action="photo.php"enctype="multipart/form-data">
		<label for="icone">Photo:</label><br />
		<input type="file" name="monimage" />
		<input type="submit" name="go" value="envoyer" />
		
</form>
et voici le fichier qui traite l'information
<?php
$dir = '../pics';
$dir_mini = '../mini';
$ratio = 150;

if (isset($_POST['go'])) {
	
	if (empty($_FILES['mon_image']['tmp_name'])) {
		
		$erreur = 'Aucun fichier envoyé.';
	}
	else {
		
		$tableau = @getimagesize($_FILES['mon_image']['tmp_name']);
		if ($tableau == FALSE) {
			
			unlink($_FILES['mon_image']['tmp_name']);
			$erreur = 'Votre fichier n\'est pas une image.';
		}
		else {
			
			if ($tableau[2] == 2) {
				
				if (is_file('../pics/'.$_FILES['mon_image']['name'])) $file_upload = '_'.$_FILES['mon_image']['name'];
				else $file_upload = $_FILES['mon_image']['name'];

				
				copy ($_FILES['mon_image']['tmp_name'], $dir.'/'.$file_upload);
				
				if ($tableau[2] == 2) {
					
					$src = imagecreatefromjpeg($dir.'/'.$file_upload);
					
					if ($tableau[0] > $tableau[1]) {
						$im = imagecreatetruecolor(round(($ratio/$tableau[1])*$tableau[0]), $ratio);
						imagecopyresampled($im, $src, 0, 0, 0, 0, round(($ratio/$tableau[1])*$tableau[0]), $ratio, $tableau[0], $tableau[1]);
					}
					else {
						$im = imagecreatetruecolor($ratio, round(($ratio/$tableau[0])*$tableau[1]));
						imagecopyresampled($im, $src, 0, 0, 0, 0, $ratio, round($tableau[1]*($ratio/$tableau[0])), $tableau[0], $tableau[1]);
					}
					
					imagejpeg ($im, $dir_mini.'/'.$file_upload);
				}
				
				
				header('location: index.php');
				exit();
			}
			else {
				
				unlink($_FILES['mon_image']['tmp_name']);
				$erreur = 'Votre image est d\'un format non supporté.';
			}
		}
	}
}
?>
Merci de votre aide se serai un grand avancement, merci de m'aiguillé

Re: echantillionage photo

par spidercrash » 14 avr. 2010, 20:50

aprés réflexion la meilleur solutions je pence c'est quand meme la création de miniature cela sera plus simple a traiter pour la suite .
Je me penche sur imagecopyresized et je reviens poster des que j'ai pondu un code ;) merci de ton aide

Re: echantillionage photo

par AB » 14 avr. 2010, 20:49

ben justement mes miniature ne sont pas enregistré c'est le script mini.php qui miniaturise les images.
a chaque affichage elle sont miniaturisé a la volet
C'est pas la bonne méthode, loin de là !
1/ Quand un visiteur télécharge une image sur le serveur il faut créer un vignette et éventuellement un agrandissement qui seront enregistrées chacune dans un dossier spécifique.

Le redimensionnement est un processus lourd qui ne doit pas être fait à chaque affichage de la page !

Au pire ça serait mieux de redimensionner tes images en htm mais la solution 1/ est celle la plus optimisée.