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

Bibliothèques et frameworks PHP Discussion :

[GD] Perte de qualité après redimensionnement


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Par défaut [GD] Perte de qualité après redimensionnement
    Bonjour,
    je suis en train de développer une classe de modification d'images à l'aide de gd, et plus particulièrement de redimensionnement d'une image selon différents paramètres.
    Toute la partie "algorithmique" marche très bien (conserver les proportions, appliquer un changement selon un ratio...) mais la modification d'image à l'aide de gd en elle même se passe mal et l'image modifiée subit une grosse perte de qualité.

    J'ai pourtant fait attention au type de l'image originale, mais visiblement pas de la bonne façon vu le résultat de l'exécution.

    Voilà ma classe :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    <?php
     
    /**
     * Classe de modification d'images.<br />Pour l'instant seule le redimensionnement et possible.
     */
    class Image {
     
        /**
         * Image à modifier.
         */
        private $img;
     
        /**
         * Type de l'image à modifier.
         */
        private $type;
     
        /**
         * Image modifiée.
         */
        private $dest;
     
        /**
         * Le constructeur appel la méthode setImage.
         *
         * @param $img Chemin vers l'image originale.
         */
        public function __construct($img='./') {
            $this->setImage($img);
        }
     
        /**
         * Définis le chemin vers l'image à modifier.
         *
         * @param $img Chemin vers l'image originale.
         */
        public function setImage($img='./') {
            if(!($this->type = exif_imagetype($img))) throw new Exception("<stong>".$img."</stong> n'est pas une image");
            $this->img = $img;
        }
     
        /**
         * Redimensionne l'image originale.
         *
         * @param $width Largeur voulue pour l'image redimentionnée.
         *
         * @param $height Longueur voulue pour l'image redimentionnée.
         *
         * @param $percent Si True, $width et $height sont compris comme des rapport d'agrandissement et non comme des valeurs absolues.
         *
         * @param $proportional Si True, les proportions de l'image originale sont gardés.
         */
        public function resize($width=0, $height=0, $percent=False, $proportional=True) {
            if(!is_numeric($width) || !is_numeric($height) || $width <= 0 || $height <= 0)
                throw new Exception("<strong>Les dimensions ".$width."x".$height."</strong> ne sont pas valides.");
            $imgInfo = getImageSize($this->img);
     
            //dimensions de l'image d'orgine :
            $initWidth = $imgInfo[0];
            $initHeight = $imgInfo[1];
     
            if($percent) {
                $width = $initWidth * ($width/100);
                $height = $initHeight * ($height/100);
            }
     
            if($proportional) {
                if($initWidth > $initHeight) $height = $initHeight * ($width/$initWidth);
                else $width = $initWidth * ($height/$initHeight);
            }
     
            if($this->type == 2) $src = imagecreatefromjpeg($this->img);
            else throw new Exception("Ce type d'images n'est pas supporté pour l'instant.");
     
            $this->dest = imagecreate($width, $height);
     
            imagecopyresampled($this->dest, $src, 0, 0, 0, 0, $width, $height, $initWidth, $initHeight);
        }
     
        /**
         * Enregistre l'image modifiée.
         */
        public function save($dir, $qualite=100) {
            if($this->type == 2) imagejpeg($this->dest, $dir, $qualite);
            else throw new Exception("Ce type d'images n'est pas supporté pour l'instant.");
        }
    }
     
    ?>
    Et mon script de test :

    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
    <?php
     
    require('./Image.class.php');
    try {
        $image = new Image('./original/2.jpg');
        $image->resize(800, 800);
        $image->save('./miniature/2.jpg');
    } catch(Exception $e) {
        $content .= $e->getMessage().'<br />';
    }
     
    ?>
    <html>
        <head>
            <title>Test de la classe Image</title>
        </head>
        <body>
            <h1>Test de la classe Image</h1>
            <?php echo $content; ?>
        </body>
    </html>
    L'image originale est en jpg et la miniature aussi.

    Après différents test je n'arrive toujours pas à trouver d'où viens mon erreur, je fait donc appel aux membres du forum qui pourrons je l'espère m'éclairer sur le bon usage de gd.

    Merci d'avance

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    utilise imagecreatetruecolor() plutôt que imagecreate().
    Bye

    Ton paramètre par défaut dans public function setImage($img='./') me semble inutile.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 10
    Par défaut
    Citation Envoyé par Djakisback Voir le message
    Salut,
    utilise imagecreatetruecolor() plutôt que imagecreate().
    Bye

    Ton paramètre par défaut dans public function setImage($img='./') me semble inutile.
    Merci pour cette réponse brève mais efficace ça marche nickel maintenant.

    ++

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

Discussions similaires

  1. [Lazarus] Redimensionnement d'une image et perte de qualité
    Par zaaryy dans le forum Lazarus
    Réponses: 6
    Dernier message: 13/04/2016, 14h07
  2. [PPT-2007] Perte de qualité d'une image après modification
    Par Léa53 dans le forum Powerpoint
    Réponses: 0
    Dernier message: 19/12/2012, 10h34
  3. Perte de qualité du texte quand site redimensionné
    Par popovitch130 dans le forum Flash
    Réponses: 0
    Dernier message: 07/08/2008, 16h27
  4. Réponses: 2
    Dernier message: 13/03/2006, 16h03
  5. Perte du password après compactage avec Jet
    Par Le Lézard dans le forum Bases de données
    Réponses: 10
    Dernier message: 07/06/2004, 11h37

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