Script upload photo : Retournement d'images

WRInaute discret
Bonsoir à tous :)

Je rencontre un souci sur un script d'upload de photos...

Il marche bien, il permet d'uploader une photo dans son format d'origine mais aussi, si nécessaire, de créer une miniature de cette photo (si ça dépasse 150px en hauteur ou en largeur).

Cependant, pour certaines photos, je constate que les miniatures se "retournent" automatiquement, pourtant je n'utilise pas de fonction FLIP ou autre.

Bref, je ne comprends pas pourquoi ça marche très bien avec la plupart des photos et pourquoi certaines miniatures se retournent...

J'ai fait une erreur quelque part... Mais où ?

Si vous avez une idée... je suis preneur !

Merci par avance :)

Code:
// Fichier vide
if(empty($_FILES['fichier_upload']['tmp_name']))
{
	echo 'Vous devez impérativement sélectionner la photo à uploader !';
}
// Problème d'upload du fichier
elseif(!is_uploaded_file($_FILES['fichier_upload']['tmp_name']))
{
	echo 'Un problème empêche le transfert de cette photo !';
}
// Vérifier le format de l'image
elseif(!$getimagesize=getimagesize($_FILES['fichier_upload']['tmp_name']))
{
	echo 'Format incorrect ! GIF, PNG ou JPG seulement !';
}
else
{
	// Traitement de l'image
	list($fichier_largeur, $fichier_haut, $fichier_type, $fichier_attr)=getimagesize($_FILES['fichier_upload']['tmp_name']);

	$fichier_poids_max=6500000;

	$fichier_hauteur_max=12240;
	$fichier_largeur_max=16320;

	$fichier_dossier='../upload/';

	$fichier_extension=substr($_FILES['fichier_upload']['name'], strrpos($_FILES['fichier_upload']['name'], '.')+1);

	$fichier_nom_sans_extension=str_replace('.'.$fichier_extension, '', $_FILES['fichier_upload']['name']);

	$fichier_nouveau_nom=date('YmdHis').'-'.$_FILES['fichier_upload']['name'];
	$fichier_nouveau_nom2=date('YmdHis').'-'.$fichier_nom_sans_extension.'_[mini150].'.$fichier_extension;


	// Photo trop lourde
	if(filesize($_FILES['fichier_upload']['tmp_name']) > $fichier_poids_max)
	{
		echo 'Cette photo est trop lourde !';
	}
	// Type GIF, PNG ou JPG seulement
	elseif($fichier_type!='1' && $fichier_type!='2' && $fichier_type!='3')
	{
		echo 'Format incorrect ! Choisissez une illustration au format GIF, JPG ou PNG seulement !';
	}
	// Image trop grande
	elseif(($fichier_largeur >= $fichier_largeur_max) || ($fichier_haut >= $fichier_hauteur_max))
	{
		echo 'Cette image est trop grande !';
	}
	else
	{
		$taille_max=150;

		if(($fichier_largeur > $taille_max) || ($fichier_haut > $taille_max))
		{
			if($fichier_haut > $fichier_largeur)
			{
				$fichier_mini_hauteur=$taille_max;
				$fichier_mini_largeur=$fichier_largeur / ($fichier_haut / $taille_max);
			}
			else
			{
				$fichier_mini_hauteur=$fichier_haut / ($fichier_largeur / $taille_max);
				$fichier_mini_largeur=$taille_max;
			}

			if($fichier_type=='1')
			{
				$fichier_source=imagecreatefromgif($_FILES['fichier_upload']['tmp_name']);
				$fichier_reduit=imagecreate($fichier_mini_largeur, $fichier_mini_hauteur);
				$fond_blanc=imagecolorallocate($fichier_reduit, 255, 255, 255);

				$fichier_largeur_reduite=imagesx($fichier_reduit);
				$fichier_haut_red=imagesy($fichier_reduit);

				$nom_fichier_reduit=$fichier_nouveau_nom2;

				imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_largeur_reduite, $fichier_haut_red, $fichier_largeur, $fichier_haut);

				imagecolortransparent($fichier_reduit, $fond_blanc);

				imagegif($fichier_reduit, $fichier_dossier.$nom_fichier_reduit);
			}

			if($fichier_type=='2')
			{
				$tmp_qualite=100;

				$fichier_source=imagecreatefromjpeg($_FILES['fichier_upload']['tmp_name']);
				$fichier_reduit=imagecreatetruecolor($fichier_mini_largeur, $fichier_mini_hauteur);

				$fichier_largeur_reduite=imagesx($fichier_reduit);
				$fichier_haut_red=imagesy($fichier_reduit);

				$nom_fichier_reduit=$fichier_nouveau_nom2;

				imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_largeur_reduite, $fichier_haut_red, $fichier_largeur, $fichier_haut);

				imagejpeg($fichier_reduit, $fichier_dossier.$nom_fichier_reduit, $tmp_qualite);
			}

			if($fichier_type=='3')
			{
				$fichier_source=imagecreatefrompng($_FILES['fichier_upload']['tmp_name']);
				$fichier_reduit=imagecreatetruecolor($fichier_mini_largeur, $fichier_mini_hauteur);

				$fichier_largeur_reduite=imagesx($fichier_reduit);
				$fichier_haut_red=imagesy($fichier_reduit);

				$nom_fichier_reduit=$fichier_nouveau_nom2;

				imagecopyresampled($fichier_reduit, $fichier_source, 0, 0, 0, 0, $fichier_largeur_reduite, $fichier_haut_red, $fichier_largeur, $fichier_haut);

				imagepng($fichier_reduit, $fichier_dossier.$nom_fichier_reduit);
			}
		}
		else
		{
			$nom_fichier_reduit=$fichier_nouveau_nom;

			if(move_uploaded_file($_FILES['fichier_upload']['tmp_name'], $fichier_dossier.$fichier_nouveau_nom))
			{

			}
			else
			{
				echo 'Problème pour uploader la photo... Contactez le développeur de l\'applicatio, !';
			}
		}


		move_uploaded_file($_FILES['fichier_upload']['tmp_name'], $fichier_dossier.$fichier_nouveau_nom);


		echo 'La photo a été uploadée avec succès !';
	}
}
?>
 
WRInaute discret
Au passage, si certains ont besoin d'un script simple pour uploader une photo et gérer la miniature... servez-vous !

Si une âme charitable peut m'aider à corriger le code pour éviter le retournement (aléatoire), vous n'aurez qu'à appliquer la correction par la suite :)
 
WRInaute passionné
Les JPEG ont parfois une donnée fournie par les téléphones pour indiquer l'orientation. Certains logiciels font la rotation automatiquement en fonction de ça, d'autres non, donc ce que tu vois est plutôt qu'il n'y a pas eu de rotation, la miniature perdant l'information exif, mais que l'image d'origine t'apparaît tournée parce que tu la visionne avec un logiciel qui le gère.
Donc il faut ajouter quelque chose comme ça pour retourner la miniature (et il faudrait le faire sur l'originale aussi) :

Code:
 if($fichier_type=='2')
{
			$exif = exif_read_data($_FILES['fichier_upload']['tmp_name']);
			
			if (!empty($exif['Orientation']))
			{
				switch ($exif['Orientation'])
				{
					case 3:
						$fichier_source = imagerotate($fichier_source, 180, 0);
						break;

					case 6:
						$fichier_source = imagerotate($fichier_source, -90, 0);
						break;

					case 8:
						$fichier_source = imagerotate($fichier_source, 90, 0);
						break;
				}
			}
 
Discussions similaires
Haut