Avatar billede Noosa Nybegynder
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.
Avatar billede Noosa Nybegynder
20. marts 2009 - 15:53 #1
Hov glemte lige at sige at det kan ses på http://www.phponline.dk/shadow/gdraw2.php
Avatar billede nicklasb Nybegynder
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);
}
...
Avatar billede Noosa Nybegynder
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.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester