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] imagepng modifie légèrement les valeurs rgb des pixels


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut [GD] imagepng modifie légèrement les valeurs rgb des pixels
    Bonjour,

    Je me rends compte que dans le code suivant, les pixels de v2.png n'ont pas exactement les mêmes valeurs que v1.png :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $img = imagecreatefrompng("uploads/v1.png");
    // déjà testé un imagecolorat ici : la valeur renvoyée est bien celle de v1.png
    imagepng($img, 'v2.png', 0);
    Dans mon cas, pour une même coordonnée de pixel, sa valeur dans v1.png est 172,179,81 et dans v2.png, et 156,166,64 dans v2.png, ce qui fait quand même une sacrée différence.

    J'ai pourtant mis 0 à l'argument quality de imagepng, pour éviter toute compression.

    J'ai aussi remarqué que, que je mette 3 ou 6 ou 0 ou même une string en quality, l'image rendue a exactement la même size (4800 octets), ce qui me laisse penser que l'argument quality n'est pas lu.

    Avez vous le même comportement ? Je suis sur PHP 7.4.12.

    Merci
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    le format png a une compression sans perte donc vous devriez retrouver les mêmes couleurs même avec une compression maximale.

    j'ai testé le code suivant avec php 7.2.34 et 8.0.17 et j'ai n'ai pas vu votre souci.
    pouvez nous mettre en pièce jointe une image que vous avez testée ?

    Code php : 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
    <?php
     
    $im = imagecreatefrompng("t1.png");
     
    imagepng($im, 'v2-0.png', 0);
    imagepng($im, 'v2-8.png', 8);
     
     
    ?>
     
    <table>
    	<tr>
    		<td>
    			<?php affiche_pixels("t1.png");?>
    		</td>
    		<td>
    			<?php affiche_pixels('v2-0.png');?>
    		</td>
    		<td>
    			<?php affiche_pixels('v2-8.png');?>
    		</td>
    	</tr>
    </table>
     
     
    <?php
     
     
    function affiche_pixels($fichier)
    {
     
    	echo "<h3>$fichier</h3>";
     
     
    	$im = imagecreatefrompng($fichier);
     
    	$w = min(imagesx($im), 5);
    	$h = min(imagesy($im), 5);
     
    	for ($y = 0; $y < $h; $y++) {
    		for ($x = 0; $x < $w; $x++) {
     
    			$rgb = imagecolorat($im, $x, $y);
    			$tab = imagecolorsforindex($im, $rgb);
     
    			echo str_repeat("=", 10) . "<br/>";
    			echo "X : $x<br/>";
    			echo "Y : $y<br/>";
    			echo "R : $tab[red]<br/>";
    			echo "V : $tab[green]<br/>";
    			echo "B : $tab[blue]<br/>";
     
    			echo "<br/>";
     
    		}
    	}
     
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut
    Bonjour,

    Étrange... Voici le fichier en question,

    J'ai essayé de changer de browser, même souci.
    J'ai essayé de bypasser la fonction, en envoyant un base64 de l'image depuis php vers html, et d'enregistrer sous l'image depuis html, même résultat

    Je remarque aussi que l'image d'origine fait 6 396 octets et que v2 fait toujours 4800 octets, quel que soit le navigateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $img = imagecreatefrompng("Tree2.png");
     
    imagealphablending($img, false);
    imagesavealpha($img, true);
    $color = imagecolorallocatealpha($img,255,255,255,127);
    imagefill($img, 0, 0, $color);
     
    $rgb = imagecolorat($img, 43, 3);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
    echo $r . " " . $g . " " . $b;
    imagepng($img, 'v2.png', 0, NULL);
    imagedestroy($img);
    Edit :
    Je viens d'essayer avec php8 et une version différente de gd :
    - arg quality pris en compte a priori, puisque les fichiers changent de poids selon l'argument passé (ce n'était pas le cas avec php7)
    - en revanche les pixels sont toujours altérés, je retrouve la même valeur quelle que soit le niveau de quality.

    Seule différence entre les deux, à part les pixels plus sombres sur v2 (je suis sur mac) : je vois que Tree2 a une propriété "Profil de couleur" qui est à "Profil générique RVB", et v2 n'a pas cette propriété.

    Encore plus malicieux, si j'ajoute ceci à la fin du code, les valeurs originales de couleur de pixel sont affichées (172 179 81) alors que paint m'indique 156, 66, 64 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $img = imagecreatefrompng("v2.png");
    $rgb = imagecolorat($img, 43, 3);
    $r = ($rgb >> 16) & 0xFF;
    $g = ($rgb >> 8) & 0xFF;
    $b = $rgb & 0xFF;
    echo $r . " " . $g . " " . $b;
    Nom : Tree2.png
Affichages : 61
Taille : 6,2 Ko
    Nom : v2.png
Affichages : 54
Taille : 11,0 Ko
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    j'ai essayé l'image que vous avez fournie et je n'ai pas de modification de couleurs.
    pouvez-vous nous montrez le résultat du code que j'ai mis en pièce jointe ?
    Fichiers attachés Fichiers attachés

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    Par défaut
    Bonjour !

    J'obtiens ceci, tout est identique lol

    Nom : Capture d’écran 2023-11-19 à 10.52.35.png
Affichages : 53
Taille : 66,8 Ko

    Mais, sur paintbrush, pixel différent.

    J'ai eu l'idée d'aller sur https://imagecolorpicker.com/

    J'ai upload Tree2, le pixel visé est à 187, 190, 98 (au lieu de 172, 179, 81 affiché sur paintbrush)
    Puis j'ai upload v2, et le même pixel est à.. 172 179 81 (au lieu de 156, 166, 64 affiché sur paintbrush).

    Ca me fait une belle jambe lol je sais pas quoi faire de ce résultat..

    Toutefois, ce que je vois (et ça se voit même d'ailleurs à l'oeil nu sur mon précédent message, en tous cas chez moi), v2 est un peu plus sombre que Tree2 après passage par GD
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

  6. #6
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    ah oui je viens aussi de me rendre compte d'une différence.
    quand je prends une capture d'écran de Tree2 dans votre message, le pixel est à 186-190-99.
    et quand j'ouvre le fichier dans gimp, je vois le pixel à 172-179-81.

    je ne m'y connais pas trop au sujet de ces profils donc vous aurez peut-être plus d'explications dans le forum suivant :
    https://www.developpez.net/forums/f6...ment-d-images/

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur du dimanche
    Inscrit en
    Février 2013
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur du dimanche

    Informations forums :
    Inscription : Février 2013
    Messages : 154
    Points : 105
    Points
    105
    "There should be no boundaries to human endeavor" - Hawking
    Retrouvez moi sur GitHub : https://github.com/JeanLouisMassei

Discussions similaires

  1. Récuperer la valeur rgb des pixels d'un gif
    Par sachadee dans le forum VBScript
    Réponses: 7
    Dernier message: 23/10/2013, 19h05
  2. Modifier toutes les valeurs d'une colonne
    Par charlie03 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2009, 08h36
  3. Réponses: 5
    Dernier message: 29/06/2008, 17h22
  4. [plot] Modifier dynamiquement les valeurs tracées sur un graphique
    Par mr_samurai dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 19/02/2008, 15h37
  5. connaitre les parametres RGB des couleurs
    Par zidenne dans le forum Delphi
    Réponses: 1
    Dernier message: 14/06/2006, 10h17

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