IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

rotation image après compression.


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Par défaut rotation image après compression.
    Bonjour,
    Dans un tchat, les utilisateurs peuvent télécharger des images ou photos que j'affiche dans le fil de discussion. Là tout se passe bien, les photos sont correctement affichées.
    Pour économiser de l'espace j'ai décidé de les compresser après upload et de les redimensionner à l'affichage. Là tout se passe correctement sauf que certaines photos s'affichent avec une rotation de 90 ou 180° mais certaines sont correctes.
    J'ai essayé en CSS : image-orientation: from-image; mais rien n'y fait. J'ai confirmé que le pb se passe au niveau de la compression en affichant la photo avant et après.
    J'ai essayé 2 functions de compression qui donnent les mêmes résultats. Ces fonctions proviennent du net, je ne les ai pas développées moi même.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function compresserImage($source, $dest, $quality) { // quality 0 à 100
    	$info = getimagesize($source);
     
    	if ($info['mime'] == 'image/jpeg')
    		 $image = imagecreatefromjpeg($source);
     
    	elseif ($info['mime'] == 'image/gif')
    		 $image = imagecreatefromgif($source);
     
    	elseif ($info['mime'] == 'image/png')
    		 $image = imagecreatefrompng($source);
     
    	// création de l'image
    	return imagejpeg($image, $dest, $quality);
    }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function convertImage($source, $dst, $width, $height, $quality){
      $imageSize = getimagesize($source) ;
      $imageRessource= imagecreatefromjpeg($source) ;
      $imageFinal = imagecreatetruecolor($width, $height) ;
      $final = imagecopyresampled($imageFinal, $imageRessource, 0,0,0,0, $width, $height, $imageSize[0], $imageSize[1]) ;
      imagejpeg($imageFinal, $dst, $quality) ;
    }
    En fait je pense qu'il faudrait pouvoir conserver les données exif mais je ne sais pas comment faire ?

    Si je pouvais avoir une piste de réflexion je serai comblé et je vous en remercie par avance.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 344
    Billets dans le blog
    17
    Par défaut
    À mon avis il faut récupérer le EXIF de l'orientation de l'original et ajuster l'orientation après traitement.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Par défaut
    Merci pour ta réponse.
    Je suppose quelque chose comme ça (trouvé sur "stackOverflow") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    // 1) save orientation before upload
    if (getimagesize($file['tmp_name'])['mime'] === 'image/jpeg') {
      $exif = exif_read_data($file['tmp_name']);
      if (!empty($exif['Orientation'])) {
        $this->file_orientation = $exif['Orientation'];
      }
    }
     
    // 2) upload and compress your photo
    // ... 
    // $output = '/path/to/compressed/photo.jpg';
     
    // 3) check orientation of original photo and rotate the new-compressed one
    if ($this->file_orientation > 1) {
      $image = imagecreatefromjpeg($output);
      if (in_array($orientation, [3, 4])) {
        $image = imagerotate($image, 180, 0);
      }
      if (in_array($orientation, [5, 6])) {
        $image = imagerotate($image, -90, 0);
      }
      if (in_array($orientation, [7, 8])) {
        $image = imagerotate($image, 90, 0);
      }
      if (in_array($orientation, [2, 5, 7, 4])) {
        imageflip($image, IMG_FLIP_HORIZONTAL);
      }
      imagejpeg($image, $output, $quality);
    }
    Ce qui m'étonne c'est que les méthodes de compression ne fassent pas ce travail de façon native car ce problème doit être récurent.
    Ou alors il y a autre chose que je n'ai pas trouvé.

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 344
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 344
    Billets dans le blog
    17
    Par défaut
    Oui j'ai déjà été confronté au problème, j'ai dû mettre en œuvre ce genre de solution.

    Ce qui m'étonne c'est que les méthodes de compression ne fassent pas ce travail de façon native car ce problème doit être récurent.
    GD repart sur une nouvelle ressource, toutes les métas sautent. Ça ne me choque pas spécialement.
    Tu peux essayer de voir comment se comportent les autres libs comme ImageMagick ou Gmagick
    https://www.php.net/manual/fr/refs.utilspec.image.php

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Par défaut
    Merci de l'info.

    Je suis en train de travailler sur une solution qui me conviendrait.
    Je ferai un retour dès que je serai satisfait de ma solution.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Mars 2012
    Messages : 34
    Par défaut
    Voilà du code qui fonctionne chez moi, les images Jpeg, gif et png sont dans le bon sens et compressés.
    La prochaine étape est de moduler le taux de compression en fonction de la taille initiale du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    function compresserImage($source, $dest, $quality) { // quality 0 à 100
    	//echo"<br />source : $source<br />";
    	//echo"<br />dest : $dest<br />";
    	$info = getimagesize($source);
    	echo"info : <br />";	print_r($info); echo"<br />";
    	$fileSize=filesize($source);
    	$fileSizeKO=strval(round($fileSize/1024))." Ko";
    	echo"taille $source = $fileSizeKO.";
     
    	// Save orientation image source ($source)
    	if ($info['mime'] == 'image/jpeg') {
    		$exif = exif_read_data($source,'tmp_name');
    		if (!empty($exif['Orientation'])) {
    		 $file_orientation = $exif['Orientation'];
    		}
    		//echo"<br />file_orientation : $file_orientation<br />";
     
    	// Check orientation of image source ($source) and rotate si nécessaire
    		//if ($file_orientation > 1) {
    		  $image = imagecreatefromjpeg($source);
    		  if (in_array($file_orientation, [3, 4])) {
    			 $image = imagerotate($image, 180, 0);
    		  }
    		  if (in_array($file_orientation, [5, 6])) {
    			 $image = imagerotate($image, -90, 0);
    		  }
    		  if (in_array($file_orientation, [7, 8])) {
    			 $image = imagerotate($image, 90, 0);
    		  }
    		  if (in_array($file_orientation, [2, 5, 7, 4])) {
    			 imageflip($image, IMG_FLIP_HORIZONTAL);
    		  }
    		//}
    	}
    	elseif ($info['mime'] == 'image/gif') {
    		 $image = imagecreatefromgif($source);
    	}
     
    	elseif ($info['mime'] == 'image/png') {
    		 $image = imagecreatefrompng($source);
    	}
     
    	imagejpeg($image, $dest, $quality);
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Identifier une superposition ? Entre deux images après rotation
    Par Strange-Days dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 09/11/2012, 18h01
  2. Réponses: 3
    Dernier message: 20/03/2012, 15h26
  3. Réponses: 1
    Dernier message: 20/07/2007, 13h53
  4. Quantifier la qualité d'une image après compression JPEG
    Par louitos dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 06/07/2007, 09h42
  5. Dimension d'une image après rotation
    Par Tyler Durden dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 03/02/2007, 19h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo