20. marts 2009 - 15:53
Der er
2 kommentarer og
1 løsning
Farve overgang i GD stopper efter 255 px
Jeg har lavet et script som skal tegne et billede der skifter farve fra sort og langsomt mod hvid.
Det virker helt fint scriptet lige indtil jeg ændrede højden til mere end 255 pixel. Efter 255 pixel begynder programmet at farve sort.
<?
$height = 500;
$width = 500;
$image = ImageCreate($width, $height);
$ir_start = 0;
$ir_end = 100;
$ir_grad = (($ir_end - $ir_start) / $height);
for($i=0; $i < ($height + 1); $i++){
$ir = round($ir_start + ($i * $ir_grad));
$color = ImageColorAllocate($image,$ir,$ir,$ir);
ImageLine($image, 0, $i, $width, $i, $color);
}
header('Content-type: image/gif');
ImageGif($image);
ImageDestroy($image);
?>
Hvis man skriver tallene for $ir ud så løber den 500 tal ned og slutter på 255. Men når man forsøget at tegne billedet bliver resten bare sort.
Ir_grad er ca 0,51 så derfor bliver ir øget med 0,5 for hvet loop hvilket gør at der skal 2 loop til at ændre farven.
På forhånd tak, har virkeligt givet mig en del hovedpine.
20. marts 2009 - 18:31
#2
Du kan ikke allokere mere end 255 farver til dit image. Det er ligegyldigt om du så allokere samme farve til billedet flere gange.
Du kan vælge at oprette et True Color Image med imagecreatetruecolor, altså:
...
$width = 500;
$image = imagecreatetruecolor($width, $height);
$ir_start = 0;
...
Det ville dog være pænere, ikke at oprette flere farver end du har brug for. Lige nu allokerer du den samme farve flere gange til billedet, hvorfor du fylder billedpaletten med flere ens farver. Når du ikke skal bruge mere end 255 farver, kan du blot bruge createimage, som du allerede selv har gjort, gemme farven for hvert gennemløb, og kun oprette en ny, hvis den ikke allerede er der. Under alle omstændigheder
(Uanset om du i stedet vælger True Color Image vil det være pænest kun at oprette farverne en gang).
Du kan gøre det med noget lignende:
...
$ir_grad = (($ir_end - $ir_start) / $height);
$ir_temp = -1;
for($i=0; $i < ($height + 1); $i++){
$ir = round($ir_start + ($i * $ir_grad));
if ($ir_temp != $ir) {
$ir_temp = $ir;
$color = ImageColorAllocate($image,$ir,$ir,$ir);
}
ImageLine($image, 0, $i, $width, $i, $color);
}
...
22. marts 2009 - 18:44
#3
Tak for svaret. Havde fundet en måde at omgå problemet på: ved at kun at allokere en farve for hver 2. linje og og så bare skrive den linje 2 gange. Og med lidt mat og lidt IF() virker det uanset størrelsen på billedet.
Men du besvarede det helt store spørgsmål, hvorfor det ikke virkede til at starte med og din ide er noget lettere end min egen lettere kikset omvej.