Avatar billede jaykid Nybegynder
21. august 2008 - 17:18 Der er 9 kommentarer

Hvordan skifter jeg farver på billeder med gdlib?

Hej eksperter :-)

Jeg skal generere et dynamisk landkort, hvor forskellige regioner i kortet skal tildeles forskellige farver dynamisk - baseret på brugerinput.

Jeg har lavet fritlagte billeder af hver enkelt region og kan få dem kopieret "ned over" det oprindelige kort uden problemer. Da hver region skal kunne have mange forskellige farver, vil jeg gerne kunne tildele regionen en farve vha. php i stedet for at lave mange billedversioner af hver region med de forskellige farvemuligheder.

Da regionerne er hvide, og resten af billedet er gennemsigtigt, lyder mit spørgsmål: Hvordan kan jeg erstatte farven hvid med en anden farve vha. PHP (sandsynligvis gdlib)?

Mine billeder er 24-bits png med transparens.
Avatar billede jakobdo Ekspert
21. august 2008 - 18:14 #1
Du kan bruge: http://dk.php.net/manual/en/function.imagecolorset.php
til at sætte en given farve i et given koordinat.
Så er det bare at løbe skidtet igennem fra 0,0 -> højde/bredde.
Avatar billede jaykid Nybegynder
22. august 2008 - 13:15 #2
Kan imagecolorset bruges på truecolor billeder?
Kan du give mig et kodeeksempel, hvor du løber samtlige pixels i billedet igennem?
Avatar billede jakobdo Ekspert
22. august 2008 - 13:50 #3
Dette kode laver f.eks. ren hvid om til rød:

<?php
//http://www.eksperten.dk/spm/842460
$file = 'http://www.eksperten.dk/img/elogo.png';
$img = imagecreatefrompng($file);

for($i = 0; $i < imagecolorstotal($img); $i++){
    $color = imagecolorsforindex($img, $i);
    if($color['red'] == 255 && $color['green'] == 255 && $color['blue'] == 255 && $color['alpha'] == 0){
        imagecolorset($img,$i,255,0,0);
    }
}

header("Content-Type: image/png");
imagepng($img);
imagedestroy($img);
?>
Avatar billede pidgeot Nybegynder
22. august 2008 - 13:53 #4
I stedet for imagecolorset, så kunne imagefill måske være en bedre ide. Det bør give bedre performance.

*går igen*
Avatar billede jakobdo Ekspert
22. august 2008 - 13:57 #5
imagecolorset() kaldes på index og kaldes ikke på hvert punkt.
Avatar billede jaykid Nybegynder
22. august 2008 - 17:08 #6
Dit eksempel virker, hvis det er et palette image. Jeg kan konvertere mit truecolor image til palette ved hjælp af imagetruecolortopalette() men så ryger transparensen.

Kan jeg bibeholde transparensen og samtidig bruge dit eksempel, eller kan jeg konvertere tilbage til truecolor, når jeg har skiftet farven ud?
Avatar billede jakobdo Ekspert
22. august 2008 - 17:40 #7
Har du et billede, som jeg evt. kan lege lidt med ?
Avatar billede jaykid Nybegynder
24. august 2008 - 10:36 #8
ja, naturligvis. Jeg har lagt et her: http://jenskeld.dk/admin/updir/9800.png

Kan du gøre det hvide område rødt (f.eks.) og bibeholde det transparente område udenom?
Avatar billede jakobdo Ekspert
24. august 2008 - 13:55 #9
Det kan jeg jo godt se, det bliver et problem! :o(
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