Kleur Klasse

Door Henk , 20 jaar geleden, 5.069x bekeken

Vond ik wel makkelijk, spreekt verder voor zich denk ik

Gesponsorde koppelingen

PHP script bestanden

  1. kleur-klasse

 

Er zijn 22 reacties op 'Kleur klasse'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Onbekend Onbekend
Onbekend Onbekend
20 jaar geleden
 
0 +1 -0 -1
Ik zou niet weten wat het is, leg uit..
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
gewoon beetje omslachtig gedoe om wat kleurtjes om te zetten
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
Heb je al eens met error_reporting E_ALL getest?
Als je E_STRICT gebruikt krijg je overigens nog een leuke melding omdat je randomKleur in je voorbeeld statisch aanroept terwijl hij dat niet is.

Overigens ben ik ook wel benieuw waarom je er voor gekozen hebt om het mogelijk te maken een kleur mee te geven aan een get-methode en dan een nieuw object in die methode aan te maken?
Persoonlijk zou ik de parameters gebruiken om aan te geven in welk formaat je de kleur terug wil hebben, dat zou het aanroepen wat vereenvoudigen denk ik.

Verder wel handig script, heb zelf ook wel eens zoiets gemaakt alleen dan om gemakkelijk hex kleurcodes in gd te kunnen gebruiken.
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
Quote:
Als je (..) niet is.
Dus dat is zo aangepast? :-)
(De melding was trouwens zo: "Strict Standards: Non-static method Kleur::randomKleur() should not be called statically in test.php on line 2")
Quote:
Overigens ben (...) te maken?
Je kan het nu op 2 manieren gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    $o
= new Kleur ( 123 , 123 , 123 );
    echo $o->getHekjeKorteHex ( );
    
    // Of
    
    echo Kleur::getHekjeKorteHex ( 123 , 123 , 123 );
?>
Quote:
Persoonlijk zou (...) denk ik.
De klasse maken wordt makkelijker, maar het aanroepen wordt moeilijker omdat je meer dingen moet onthouden zoals rare constanten als KLEUR_MODE_RGB of iets dergelijks.
Quote:
Verder wel (...) kunnen gebruiken.
Hoe geef je in GD een kleur op?
MennoDikjo
MennoDikjo
20 jaar geleden
 
0 +1 -0 -1
Ik vind het een goed en handig script, alleen vind ik de namen van de methoden wat onhandig. Misschien had je beter een optioneel argument kunnen vragen voor 'metHekje' of 'zonderHekje':

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    
    Kleur::get_korte_hex( $r, $g, $b, $hekje = false ) {  }
    
?>
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
ja da's dus makkelijk zelf aan te passen he
MennoDikjo
MennoDikjo
20 jaar geleden
 
0 +1 -0 -1
Ik moet toch wat commentaar leveren? Dat hoort toch?
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
njwah, bedankt dan?
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
Je kan nu ook websafe maken, inverteren, mengen en van een kleur een grijswaarde maken.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
ik ook een soort class/lib

Aantal dingen: RGB(A) gaat veel sneller middels bit shiften!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$int
    = imagecolorat($img, $x, $y);
$rgb     = array();
$rgb[]    = ($int & 0x7F0000)    >> 24;
$rgb[]    = ($int & 0xFF0000)    >> 16;
$rgb[]    = ($int & 0x00FF00)    >> 8;
$rgb[]    = ($int & 0x0000FF)    >> 0;
return $rgb;
?>


En websafe maken kan ook nog simpeler eventueel... ;)

en van RGB2HEX:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
sprintf('#%02X%02X%02X', $r, $g, $b);
?>


Zoals al aangegeven is dit meer een verzameling van functies welke je beter static kan maken. Hebben geen object nodig!

Ik heb zelf ook nog dingen als:
$colors = colors::range('#336699', 3);

krijg dan een range van 3 kleuren welke allemaal lijken op #336699 + originele...
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
Quote:
Je kan het nu op 2 manieren gebruiken:

Eigenlijk niet, omdat je dan de strict regels overtreed wat je toch liever niet doet lijkt me...

Quote:
De klasse maken wordt makkelijker, maar het aanroepen wordt moeilijker omdat je meer dingen moet onthouden zoals rare constanten als KLEUR_MODE_RGB of iets dergelijks.

Ik doelde eigenlijk meer op de manier zoals MennoDikjo al zegt alleen dan nog anders.
Bijvoorbeeld: getHex($methekje=true, $sort=false);
Dan heb je alleen wel een set methode nodig en dan kan je niet meer alle methoden static maken zoals Lode voorstelt, wat mij ook een goede optie lijkt, gewoon de constructor er uit en alles static.
Quote:
Hoe geef je in GD een kleur op?

met imagecolorallocate, maar dat is meer iets voor in bijvoorbeeld een image klasse, die zou je dan een methode setKleur(Kleur $kleur); kunnen geven die alleen instanties van Kleur accepteert.
Thijs X
Thijs X
20 jaar geleden
 
0 +1 -0 -1
Leuke klasse, alleen of het echt bruikbaar is weet ik niet.

Btw een typo op regel 179:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
return new seld ( $iR , $iG , $iB );
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
Lode: ik snap niks van die code. En wat staat er in $img? En heb je dat nodig? En hoe maak je websafe makkelijker / sneller? RGB2Hex is misschien wel mooier met sprintf ja, zal eens kijken :P Betekent %02X daar dat het hexadecimaal moet?

Boaz: ach, stricte regels overtreden, ik zie eerlijk gezegd niet waarom. En getHex met parameters lijkt me niet leuk. Zo kan je de functie ook niet meer statisch oproepen, of je moet de parameters opschuiven enzo en ze er soms bij zetten terwijl het eigenlijk niet nodig zou hoeven zijn. Verder ben ik wel benieuwd hoe de image of pixel klasse een object Kleur zou moeten omzetten naar een php-plaatje-kleur?

Thijs: kijk, dat zijn de makkelijke fouten :-P Dankje :-D
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
final class colors{

    /**
     * random
     * returns randow #hex color
     *
     * @return string $hex
     */

    final static public function random(){
        return sprintf('#%02X%02X%02X', mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
    }

    /**
     * hex2rgb
     * bitshifts a hex string to r,g,b array
     *
     * @param string $hex
     * @return array $rgb
     */

    final static public function hex2rgb($hex){
        $hex = ltrim($hex, '#');
        switch(strlen($hex)){
            case
3    :     list($l, $m, $r) = str_split($hex, 1);
                        $hex = str_repeat($l, 2).str_repeat($m, 2).str_repeat($r, 2);

            case
6    :
                        $dec    = hexdec($hex);
                        $r         = 0xFF & $dec >> 16;
                        $g         = 0xFF & $dec >> 8;
                        $b         = 0xFF & $dec >> 0;
                        return array($r, $g, $b);
        }

                return false;
    }

    /**
     * websafe
     * converts an $rgb array to websafe colors
     *
     * @param array $rgb
     * @return array $rgb
     */

    final static public function websafe(array $rgb){    
            
        list($r, $g, $b) = array_values($rgb);        
            
        $r     = (round($r/ 51) * 51);
        $g     = (round($g/ 51) * 51);
        $b     = (round($b/ 51) * 51);
            
        return array($r, $g, $b);
    }

    /**
     * rgb2hex
     * convert $rgb array to string hex
     *
     * @param array $rbg
     * @return string $hex
     */

    final static public function rgb2hex(array $rbg){
        list($r, $g, $b) = array_values($rgb);
        return sprintf('#%02X%02X%02X', $r, $g, $b);
    }
}





/********************************/
//random color

$r = colors::random();
echo 'random hex color: '.$r.'<br/>'.PHP_EOL;

//hex2rgb
$test = colors::hex2rgb('#336699'); //#369 werkt hier dus ook gewoon....
echo 'rgb:'.colors::rgb2hex($test).'<br/>'.PHP_EOL;
echo '<pre>'.print_r($test, true).'</pre><br/>'.PHP_EOL;

//websafe
$bad = colors::hex2rgb('#4E8CD1'); // no clue what color this even is...
$new = colors::websafe($bad);
echo 'rgb:'.colors::rgb2hex($new).'<br/>'.PHP_EOL;
echo '<pre>'.print_r($new, true).'</pre><br/>'.PHP_EOL;
?>


Ik heb een hele dikke gd-image lib zelf gemaakt...
Hier houd het op... alles is natuurlijk wel te koop ;)

EDIT:
en zo heb ik nog veeeeeeel meer opties...
colors::breed('#369', 5);
nog 20 ofzo....

greyscale doe ik gewoon met aparte class voor images:
imagd::greyscale(&$img);

en dan hebben we nog een drawing API met anti-alias
voor grafieken, pie-charts etc...
geen neppe GD resize zooi...

stuk of 25 filters...
imagd::speckle();
imagd::detectBackground();
imagd::reflect(25); //%
en nog veel meer...
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
@Henk, inderdaad, statisch aanroepen is dan niet meer mogelijk, maar eigenlijk vind ik toch dat je beter een keuze kan maken OF je methoden statisch OF niet, maar niet op twee manieren door elkaar aanroepen.

Ik heb even een voorbeeldje online gezet van mijn klassen GDColor en GDImage, ik heb ze nooit afgemaakt en het zijn slechts probeersels, maar je kan ze toch eens bekijken. php.n3rd.nl/gdkleur.php
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
gezien je niet afhankelijk bent van class methods ofwel $this->
kan je er makkelijk statics van maken!
je class is dan meer een verzameling van functies die geen object nodig hebben...

net als bijvoorbeeld validatie...

Filters in een color class gaat mij iets te ver...

EDIT1:
GD == interne config bij mij...
externe input krijgt zoiezo een heel andere bahandeling...
Maar dat gebeurd absoluut dan buiten een class...
Noemen ze single-responsebility-principal...

EDIT2:
class colors houdt zich bezig met kleuren... geen validatie!
dat doet class validate...
Bo az
Bo az
20 jaar geleden
 
0 +1 -0 -1
Je hebt gelijk als je zegt dat er niet gevalideerd hoeft te worden, zeker zolang er geen user input bij komt te kijken.

Quote:
class colors houdt zich bezig met kleuren... geen validatie!
dat doet class validate...

Als je dat gaat doorvoeren mag een klasse validatie zich weer niet bezighouden met de validatie van kleuren...

Bovendien gebruik ik daar standaard php functies voor zoals wel vaker binnen php en komt er überhaupt nooit een validatie klasse bij kijken.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
ik heb een aparte class voor gd validatie welke binaire headers leest:

valid::png();
valid::jpg();
valid::gif(); // != animated!
valid::hex(); // gewoon regexje voor 3 en 6 hex colors...
valid::gd(); // resource
valid::alpha(); // alpha png/gif header?
valid::x00(); // zero-bite hack

en nog meer....

EDIT:
deze gebruik ik inderdaad alleen voor uploads.... niet intern...
Henk
Henk
20 jaar geleden
 
0 +1 -0 -1
Lode: bedankt voor het simpele websafe, en voor het simpele rgb2hex. Zou je je valid klasse willen laten zien? Ik ben benieuwd naar de binaire headers.

Boaz: ik denk dat ik in het geval van mijn Kleur klasse voor geen statische functies ga dan.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
en de snellere/betere hex2rgb ???

Welkom in de wondere wereld van RFC's
http://www.w3.org/Graphics/GIF/spec-gif89a.txt

Dat is iig de specificatie van gif89a
en dan heb je nog gif87a natuurlijk en animated gif's... en jpg's (normaal, interlaced)... en png...

Zijn niet echt scripts die ik hier "even" ga opplakken ben ik bang... Zijn met bloed, zweet en tranen gemaakt voor commerciele doeleinden...

Je kan ook dingen aanpassen natuurlijk... zoals bijvoorbeeld dpi instellen enzo...
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Mijn simpele variant, met wat minder opties. Ik gebruik hem zelf vooral als argument voor bijvoorbeeld een klasse die plaatjes manipuleert, en daarbij een achtergrondkleur nodig heeft.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php

class IHGColor {

    public
        $red,
        $green,
        $blue,
        $alpha;

    static public function fromHex($hex)
    {

        $hex = hexdec($hex);

        return new self(
            0xFF & ($hex >> 0x10),
            0xFF & ($hex >> 0x8),
            0xFF &  $hex);
    }


    public function __construct($red, $green, $blue, $alpha = 1.0)
    {

        if($red > 255 || $green > 255 || $blue > 255) {
            throw new Exception('Color out of range. Only 0 to 255 is a valid value');
        }


        if(0 > $alpha || $alpha > 1.0) {
            throw new Exception('Alpha out of range. Only 0 to 1 is a valid value');
        }


        $this->red = $red;
        $this->green = $green;
        $this->blue = $blue;
        $this->alpha = $alpha;
    }

    
    public function toHex()
    {

        return dechex($this->red + 0) . dechex($this->green + 0) . dechex($this->blue + 0);
    }

    
    public function toCMYK()
    {

        $cyan         = 255 - $this->red;
        $magenta     = 255 - $this->green;
        $yellow     = 255 - $this->blue;
        $black        = min($cyan, $magenta, $yellow);
        
        $cyan        = @(($cyan        - $black) / (255 - $black)) * 255;
        $magenta    = @(($magenta    - $black) / (255 - $black)) * 255;
        $yellow        = @(($yellow    - $black) / (255 - $black)) * 255;
        
        return array(
            0 => $cyan / 255,
            1 => $magenta / 255,
            2 => $yellow / 255,
            3 => $black / 255,
            
            'c' => $cyan / 255,
            'm' => $magenta / 255,
            'y' => $yellow / 255,
            'k' => $black / 255);
    }
}


?>

Effecten als Inverse, mix & black-white zouden een mooie toevoeging zijn. Aanroepen gaat bij mij bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
var_dump(
    IHGColor::fromHex('ffdd00')->toCMYK()
);

?>
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Marcel
Marcel
20 jaar geleden
 
0 +1 -0 -1
Boaz: ik ben overtuigd wat betreft het statisch / dynamisch aanroepen waar het niet mag.

In PHP 6 zal dit een fatal error opleveren. Ik zal de klasse eens gaan aanpassen.

Oja: ik ben de Henk die deze klasse heeft gemaakt maar dat account werkt op één of andere onverklaarbare reden niet meer (niks van gehoord, in één keer werkte inloggen gewoon niet) dus kan ik de klasse niet wijzigen.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. kleur-klasse

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.