Avatar billede akyhne Nybegynder
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?
Avatar billede coderdk Praktikant
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 ;)
Avatar billede nicklasb Nybegynder
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.
Avatar billede akyhne Nybegynder
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 :-/
Avatar billede nicklasb Nybegynder
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.
Avatar billede coderdk Praktikant
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 );

?>
Avatar billede akyhne Nybegynder
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.
Avatar billede nicklasb Nybegynder
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? ;)
Avatar billede akyhne Nybegynder
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.
Avatar billede coderdk Praktikant
04. februar 2009 - 19:47 #9
:D
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