En tiedä miten nämä hex/rgb värisävyt menevät, joten kysyn täältä. Millaisella silmukalla saisin väristä #000000 kaikki värit #FFFFFF asti? Eli, kaikki 256 väriä väliltä musta-valkoinen? (Eikös niitä 256 ollutkin?)
Löysin sellaisen kerran, mutta en enään löytänyt uudelleen.
Jos kuvitellaan, että samalla koodilla laittaa kaikki värit allekkain väristä #000000, niin toimiiko se myös vaikka väristä #FF0000 samalla tyylillä, että tulee kaikki värit valkoiseen asti?
Muokkaus.
Jaa-a, onnistuin generoimaan tälläisen yksinkertaisen silmukan:
Jos tutustut 16-järjestelmään, asiat selviävät. Koodissa #123456 on oikeastaan kolme lukua: punaisen arvo on 12, vihreän 34 ja sinisen 56, kaikki 16-järjestelmässä. Kymmenjärjestelmään muutettuna arvot ovat 18, 52 ja 86. Voit muodostaa "värikoodeja" yksinkertaisesti for-silmukalla ja tulostamalla luvut 16-järjestelmässä.
<?php function rgb($r, $g, $b) { // Varmistetaan, että luvut ovat kokonaislukuja väliltä [0, 255]. $r = min(max(0, round($r)), 255); $g = min(max(0, round($g)), 255); $b = min(max(0, round($b)), 255); // Tulostetaan luvut oikein. return sprintf("#%02x%02x%02x", $r, $g, $b); } function luvut($koodi) { // Tarkistetaan koodin muoto: #123 tai #123456 if (!preg_match('/#([0-9a-fA-F]{3}){1,2}/', $koodi)) { return null; } # Luetaan kuuden merkin koodi. if (sscanf($koodi, "#%2x%2x%2x", $r, $g, $b) != 3) { # Ei onnistunut. Luetaan kolmen merkin koodi ja kerrotaan 0x11:lla. sscanf($koodi, "#%1x%1x%1x", $r, $g, $b); $r *= 0x11; $g *= 0x11; $b *= 0x11; } # Palautetaan taulukko. return compact("r", "g", "b"); } echo rgb(18, 52, 86), "\n"; // #123456 echo print_r(luvut("#123456"), 1), "\n"; // (18, 52, 86) echo print_r(luvut("#123"), 1), "\n"; // #123 => #112233 => (17, 34, 51)
Ookkei, tuo hexin muunto rgb:ksi-funktio on kätevä. Sain tehtyä monta erillaista kokeilua, mutta jotkin värit eivät toimi. Jos antaa vihreän hexin, niin alkaa siitä ja loppuu turkoosiin jne. Musta, punainen, keltainen ja valkoinen toimivat, mutta pitäisi saada se toimimaan mistä tahansa väristä.
<table cellspacing="0" cellpadding="0" width="300" style="border: 1px solid black" align="left"> <?php $vari = "#" . $_GET["v"]; function luvut($koodi) { // Tarkistetaan koodin muoto: #123 tai #123456 if (!preg_match('/#([0-9a-fA-F]{3}){1,2}/', $koodi)) { return null; } # Luetaan kuuden merkin koodi. if (sscanf($koodi, "#%2x%2x%2x", $r, $g, $b) != 3) { # Ei onnistunut. Luetaan kolmen merkin koodi ja kerrotaan 0x11:lla. sscanf($koodi, "#%1x%1x%1x", $r, $g, $b); $r *= 0x11; $g *= 0x11; $b *= 0x11; } # Palautetaan taulukko. return array($r, $g, $b); } list($r, $g, $b) = luvut($vari); function rgbhex($red, $green, $blue) { return sprintf('#%02X%02X%02X', $red, $green, $blue); } for($i = 0; $i <= 255; $i += 12) { $a = 12; if($i > 127) $color = "black"; else $color = "white"; echo "<tr><td style=\"background-color: rgb($r, $g, $b); color: $color\" onMouseOver=\"document.bgColor='rgb($r, $g, $b)'\"> rgb($r, $g, $b), hex: " . rgbhex($r, $g, $b) . "</td></tr>\n"; if($vari == "#000000" && $r + $a < 255) $r += $a; if($g + $a < 255) $g += $a; if($b + $a < 255) $b += $a; if($i < 255 && $i + $a > 255) echo "<tr><td style=\"background-color: rgb(255, 255, 255); color: $color\" onMouseOver=\"document.bgColor='rgb(255, 255, 255)'\"> rgb(255, 255, 255), hex: " . rgbhex(255, 255, 255) . "</td></tr>\n"; } ?> </table>
Tältä näyttää tällä hetkellä koodi. Toimii joistain perusväreistä ihan hyvin, mutta jotkin muut, kuten vihreä menevät ihan päin puuta.
Muokkasin huvikseni ja testailin, kyllä tuo näyttäs vihreestäkin valkoseen vetävän.
Sainkin sen jo toimimaan kaikilla väreillä, mutta tuo on kyllä paljon selkeämpi vaihtoehto. Kiitos!
Tässä vielä huvin vuoksi kevyempi, pelkällä JavaScriptillä toteutettu versio ilman hex-muunnoksia.
Minulla ei tuo auennut.
Mietimpä tässä vielä, että jos on annettu vaikka väri #B3B3FF, niin voiko koodilla päätellä mikä sen pääväri on?
Kun jaat sen komponentteihin (r, g, b), voit koodissa tarkistaa, missä suhteessa näitä päävärejä on ja miten suuria suurimmat ja pienimmät arvot ovat.
Esimerkistäsi näkee suoraan, että punaista ja vihreää on saman verran mutta sinistä hieman enemmän, joten sävy on sininen. Sinistä on maksimimäärä, joten väri ei varmasti ole tumma, ja koska muitakin on aika paljon, värin on oltava vaaleansininen eikä kirkkaansininen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.