Discussion:
libraire GD et couleur de rectangles
(trop ancien pour répondre)
apolloj
2010-01-27 20:07:46 UTC
Permalink
Bonjour,

En fait je représente des serveurs sur une baie et certains sont
virtuels donc au lieu de les représenter en HORIZONTAL je les mets en
VERTICAL sur la hauteur d'un serveur en U.

Le dessin est visible à http://picasaweb.google.com/apolojnet/GD_Rectangle#5431403420003452818.

J'ai un pb de couleur lorsque je dessine des rectangles (représentant
des serveurs VIRTUELS) cote-à-cote en PHP en utilisant :

Appel du script avec les paramètres pour faire le dessin :

<div style="position:absolute; top:267 ; left:39 ; z-index: 2;">
<a href="fiche.php?h=Test1">
<img src="images/serveur.php?v=1&h=Test1&p=ACQUI
PIVOT&u=2&g=4&d3&c=orange" alt="Bull express5800_120" style"z-
index: 2" border=0> </a></div>

<div style="position:absolute; top:267 ; left:189 ; z-index: 2;">
<a href="fiche.php?h=Test2">
<img src="images/serveur.php?v=1&h=Test2&p=ACQUI
PIVOT&u=2&g5&d03&c=gris" alt="Bull express5800_120" style"z-
index: 2" border=0> </a></div>


Les rectangles au lieu d'etre GRIS sortent en NOIR.
Voilà le bout de code (à proprement parler) qui fait le dessin
(librairie GD 2.0.36)

Code serveur.php

<?php
// Variables
$haut = 20;
$bas = 670;
$un_u = 15;
$gauche=3;
$droite=303;
//$indentation = $gauche + 3;
$u = $_GET['u'];
$hostname = $_GET['h'];
$projet = $_GET['p'];
$couleur = $_GET['c'];
$v = $_GET['v'];
$droite_v = $_GET['d']; $gauche_v = $_GET['g'];
$hauteur = $un_u * $u;

header ("Content-type: image/jpeg");
$largeur_v=($droite_v-$gauche_v) ;
//$image = imagecreate($droite,$hauteur);
$image = imagecreatetruecolor($largeur_v,$hauteur);

$gris = imagecolorallocate($image,192,192,192);
$noir = imagecolorallocate($image,0,0,1);
$rouge = imagecolorallocate($image,255,10,10) ;
$violet = imagecolorallocate($image,133,145,200);
$blanc = imagecolorallocate($image,255,255,255);
$orange= imagecolorallocate($image,255,165,0) ;
$col_string=$noir;

imagesetthickness ($image, 1);
if (!isset($couleur)) { $couleur="gris";}
if ($v==1) {$col_string=$violet; }

ImageFilledRectangle ($image, $gauche_v, 0, $droite_v, $hauteur,$
{$couleur});
ImageRectangle ($image, $gauche_v, 0, $droite_v, $hauteur, $violet);

if ($v!=1) {
$aligne_bas = $hauteur - $un_u;
imagestring($image, 3, 20, $aligne_bas, "$hostname", $col_string);
}
else
{
$aligne_bas = $un_u;
imagestring($image, 3, 20, $aligne_bas, "$hostname", $col_string);
//$milieu=floor(($droite_v+$gauche_v)/2);
//imagestringup($image, 1, $milieu, $aligne_bas, "$hostname",
$col_string);
}
imagestring($image, 3, 120, $aligne_bas, "$projet", $col_string);
imagejpeg($image);
//imagepng($image,'./'.$hostname.'.png');
imagedestroy($image);
?>
Olivier Miakinen
2010-01-27 23:17:22 UTC
Permalink
Bonjour,
Post by apolloj
[...]
<div style="position:absolute; top:267 ; left:39 ; z-index: 2;">
<a href="fiche.php?h=Test1">
<img src="images/serveur.php?v=1&h=Test1&p=ACQUI
PIVOT&u=2&g=4&d3&c=orange" alt="Bull express5800_120" style"z-
index: 2" border=0> </a></div>
Attention : le caractère « & » est réservé. Pour le transmettre dans une
URL, tu dois l'écrire « &amp; ».

Attention : le caractère de contrôle de code hexa 15 dans « d3 » n'est
pas autorisé dans une URL. Tu dois le coder autrement.

Si ça se trouve, ton problème vient de l'un des bugs ci-dessus.

Ok pour « c=orange ».
Post by apolloj
<div style="position:absolute; top:267 ; left:189 ; z-index: 2;">
<a href="fiche.php?h=Test2">
<img src="images/serveur.php?v=1&h=Test2&p=ACQUI
PIVOT&u=2&g5&d03&c=gris" alt="Bull express5800_120" style"z-
index: 2" border=0> </a></div>
Idem pour le « & », et pour le code hexa 15 dans « g5 ».

Ok pour « c=gris ».
Post by apolloj
[...]
$u = $_GET['u'];
$hostname = $_GET['h'];
$projet = $_GET['p'];
$couleur = $_GET['c'];
$v = $_GET['v'];
$droite_v = $_GET['d']; $gauche_v = $_GET['g'];
Tu ne fais pas plus de contrôles que ça sur les paramètres ? Hum... ce
n'est pas très sécurisé, tout ça...
Post by apolloj
[...]
if (!isset($couleur)) { $couleur="gris";}
C'est très moyen... $couleur peut valoir n'importe quoi. Par exemple, si
un utilisateur malveillant appelle ton script avec « c=image », c'est la
variable $image que tu passeras au ImageFilledRectangle qui suit au lieu
d'une ressource couleur ! Et si jamais tu avais un mot de passe dans une
variable $password, il peut essayer de passer 'c=password' pour voir si
par hasard ça ne retournerait pas une erreur du style « la variable
$MONMOTDEPASSE n'existe pas, et ainsi afficher ton mot de passe...

Pour ma part, je ferais plutôt :
switch($_REQUEST['c']) {
case 'noir': $couleur = $noir; break;
case 'rouge': $couleur = $rouge; break;
case 'blanc': $couleur = $blanc; break;
...
default: $couleur = $gris;
}

... et bien sûr c'est $couleur plutôt que $$couleur que je passerais à
la fonction ImageFilledRectangle.


Quoi qu'il en soit, commence donc par corriger les URL lors de l'appel,
si ça se trouve ça suffira à résoudre le problème de couleur. Tu peux
aussi, pour débuguer, supprimer le header Content-Type et afficher les
paramètres qui sont récupérés.

Cordialement,
--
Olivier Miakinen
Continuer la lecture sur narkive:
Loading...