04. februar 2009 - 17:05
Der er
7 kommentarer og 2 løsninger
Funktion til at finde farver
Hej derude. Er der en php funktion til at finde farver imellem 2 angivne farver? Hvis jeg f.eks allokerer farven imagecolorallocate($dst_img,142,171,198); og farven imagecolorallocate($dst_img,84,124,159); .. og derefter gradvis vil finde og allokere 7 mellemliggende farver?
Annonceindlæg fra Academic Work Denmark A/S
04. februar 2009 - 18:16
#1
Træk den ene R-værdi fra den anden, dividér med 9 (du vil ikke have start og slut), så har du 7 skridt imellem - Gør det samme for G og B :) Jeg tror ikke der er en funktion til at lave en gradient mellem to farver ;)
04. februar 2009 - 18:19
#2
Det kommer meget an på, hvordan du beskriver "mellemliggende farver." Hvis du betragter RGB-farven som en kube (3D) og blot ønsker den direkte afstand i planet kan det gøre med noget lignende: $color1 = array(142, 171, 198); $color2 = array(84, 124, 159); $between = 7; $color = array(); for($i = 1; $i <= $between; $i++) { $color[$i] = array(); foreach($color1 as $colork => $temp) $color[$i][$colork] = $color1[$colork] - round(($color1[$colork] - $color2[$colork]) / ($between + 1) * $i, 0); } Du vil dog hurtigt opdage at farverne i den lyse ende er sværre at se forskel på, end de mørke farver.
04. februar 2009 - 18:21
#3
Det er egentlig blot til at lave en fyld af en firkant fra en farve til en anden. Egentlig mærkelig der ikke er en funktion til det. Jeg må i gang med at lave min egen funktion :-/
04. februar 2009 - 18:28
#4
Du kan sagtens flyde det i en funktion, alá function getColors($color1, $color2, $between) { for($i = 1; $i <= $between; $i++) { $color[$i] = array(); foreach($color1 as $colork => $temp) $color[$i][$colork] = $color1[$colork] - round(($color1[$colork] - $color2[$colork]) / ($between + 1) * $i, 0); } return $color; } Men det kan være du skal have noget vægtning ind, sådan at der ligges mere til, jo lavere tallet er, for netop at forhindre de skæve overgange.
04. februar 2009 - 18:35
#5
Her er en test: <? function gradient( $startRGB, $endRGB, $steps ) { $gradient = array(); $stepR = ( $startRGB[0] - $endRGB[0] ) / $steps; $stepG = ( $startRGB[1] - $endRGB[1] ) / $steps; $stepB = ( $startRGB[2] - $endRGB[2] ) / $steps; for ( $i = 0; $i < $steps; $i++ ) { $gradient[] = array( $startRGB[0] + ( $stepR * $i ) ,$startRGB[1] + ( $stepG * $i ) ,$startB[2] + ( $stepB * $i ) ); } return $gradient; } $w = 500; $h = 500; $steps = 7; $im = imagecreatetruecolor( $w, $h ); $grad = gradient( array( 142, 171, 198 ), array( 84, 124, 159 ), $steps ); $stepW = $w / $steps; $c = array(); for ( $x = 0; $x < $steps; $x++ ) { $c[$x] = imagecolorallocate( $im, $grad[$x][0], $grad[$x][1], $grad[$x][2] ); imagefilledrectangle( $im, $x * $stepW, 0, ( $x + 1 ) * $stepW, $h, $c[$x] ); } header("Content-Type: image/png"); imagepng( $im ); ?>
04. februar 2009 - 19:06
#6
Tak, tak, tak begge to. Det er rigeligt :) Jeg skulle egentlig bare høre om der var en funktion. Det er der nu, så jeg spares for arbejdet. nicklasb: Din funktion giver 7 mellemliggende farver. Start- og slut farven skulle være en del af arrayet. Men den fikser jeg selv. Smid begge et svar.
04. februar 2009 - 19:24
#7
Kan du ikke bare trække 2 fra $number? Hvis det er "7 mellemliggende" er grundfarverne vel ikke inklusiv? ;)
04. februar 2009 - 19:34
#8
Jo, grundfarverne er inklusive i arrayet, men jeg skal stadig have 7 mellemliggende farver. Jeg har løst det.
04. februar 2009 - 19:47
#9
:D
Vi tilbyder markedets bedste kurser inden for webudvikling