Discussion:
Un bug sur la librairie GD ?
(trop ancien pour répondre)
s***@noos.fr
2007-02-04 21:32:59 UTC
Permalink
Je galères depuis déjà au moins 2 semaines sur le problème suivant:
Ce code a pour but, dés que j'aurais résolu mon problème, de générer
des images coté serveur avec un fond en dégradé radial. Mais pour
l'instant, pour simplifier, il s'agit de faire 20 lignes de 20 carrée
de 10 Px par 10 , en alternant à chaque fois, carrée bleu, carrée
blanc, carrée bleu...
La condition if de la boucle for de la classe ligneCarree, indique
que si la couleur RVB vaut 0,255,255 alors la remplacer par la couleur
255,255,255, en alternant $rouge=0 et $rouge =255
Mais voila cela se passe bien jusqu'a la 13 ème ligne au 255 ème
carrée !!!!??? La couleur passe alors, au bleu, définitivement.
Mais alors de quoi s'agit il ?...si quelqu'un a une idée ?..
Je n'ai pourtant pas demandé de compté le nombre de carrée :?

<?php
header("Content-type: image/jpeg");

class fond
{
var $noir;
var $im;

function fond($img)
{
$this->im = $img;
$this->noir=imageColorAllocate($this->im,0,0,0);
imagefill($this->im,10,10,$this->noir);
}
}

class ligneCarree
{

var $x2;
var $couleur;
var $im;



function ligneCarree($img,$X,$x1,$y1,$y2,$rouge)
{

$this->im = $img;
for($this->x2=10; $this->x2 < $X+1 ;$this->x2+=10)
{
$this->couleur=imageColorAllocate($this->im,$rouge,255,255);
imagefilledrectangle($this->im,$x1,$y1,$this->x2,$y2,$this-
couleur);
$x1+=10;

$rouge+=255;
if ($rouge > 255)
{
$rouge=0;
}

}
}
}


$X=205;
$Y=205;
$x1=0;
$y1=0;
$rouge=0;

$image=imagecreate($X,$Y);
$tableau = new fond($image);

for($y2=10; $y2<131 ;$y2+=10) // REMPLACER 131 par $Y+1
{
$ligne2 = new ligneCarree($image,$X,$x1,$y1,$y2,$rouge);
$y1+=10;
}

imageJPEG($image);
imagedestroy($image);
?>
Olivier Miakinen
2007-02-04 22:16:18 UTC
Permalink
[...]..
La condition if de la boucle for de la classe ligneCarree, indique
que si la couleur RVB vaut 0,255,255 alors la remplacer par la couleur
255,255,255, en alternant $rouge=0 et $rouge =255
Mais voila cela se passe bien jusqu'a la 13 ème ligne au 255 ème
carrée !!!!??? La couleur passe alors, au bleu, définitivement.
Je n'ai pas lu tout ton programme, mais j'ai déjà une idée qui pourrait
expliquer. Si ce n'est pas cela, il faudra chercher plus loin.
[...]
$image=imagecreate($X,$Y);
Ceci crée une image basée sur une palette de couleurs (par exemple pour
créer un GIF d'au plus 256 couleurs). Alors si ensuite tu fais trop
d'imagecolorallocate() il est possible que tu exploses la taille de la
palette.
imageJPEG($image);
Surtout si c'est pour créer une image JPEG, tu ferais mieux d'utiliser
imagecreatetruecolor() à la place.
P'tit Marcel
2007-02-05 08:03:12 UTC
Permalink
Post by Olivier Miakinen
Ceci crée une image basée sur une palette de couleurs (par exemple pour
créer un GIF d'au plus 256 couleurs). Alors si ensuite tu fais trop
d'imagecolorallocate() il est possible que tu exploses la taille de la
palette.
J'opine. Il faudrait mieux faire au départ un colorallocate pour le
rouge et un pour le bleu et ensuite se servir des pointeurs sur ces
couleurs pour créer les carrés.

Par ailleurs, c'est ballot de créer chaque carré alors qu'ils sont
jointifs. Pour gagner du temps, remplit ton image de bleu puis crée un
carré sur deux en rouge. Au final tu auras divisé par deux le nombre de
imagefilledrectangle.


eça
--
P'tit Marcel
stats sur les forums modérés http://www.centrale-lyon.org/ng/
Olivier Miakinen
2007-02-05 08:22:13 UTC
Permalink
Il [v]audrait mieux faire au départ un colorallocate pour le
rouge et un pour le bleu et ensuite se servir des pointeurs sur ces
couleurs pour créer les carrés.
Tu as raison, bien sûr. Ce sera la même chose pour le script prévu, avec
dégradé radial : chaque couleur ne devrait être allouée qu'une seule fois.
Par ailleurs, c'est ballot de créer chaque carré alors qu'ils sont
jointifs. Pour gagner du temps, remplit ton image de bleu puis crée un
carré sur deux en rouge. Au final tu auras divisé par deux le nombre de
imagefilledrectangle.
Je suppose que ceci sera difficilement applicable au script final,
chaque couleur ne se trouvant que sur une ligne si j'ai bien compris.
Continuer la lecture sur narkive:
Loading...