Kleur Klasse
Door Henk , 20 jaar geleden, 5.027x bekeken
Vond ik wel makkelijk, spreekt verder voor zich denk ik
Gesponsorde koppelingen
PHP script bestanden
Er zijn 22 reacties op 'Kleur klasse'
Gesponsorde koppelingen
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.
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.
Quote:
Dus dat is zo aangepast? :-)Als je (..) niet is.
(De melding was trouwens zo: "Strict Standards: Non-static method Kleur::randomKleur() should not be called statically in test.php on line 2")
Quote:
Je kan het nu op 2 manieren gebruiken:Overigens ben (...) te maken?
Code (php)
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.Persoonlijk zou (...) denk ik.
Quote:
Hoe geef je in GD een kleur op?Verder wel (...) kunnen gebruiken.
ik ook een soort class/lib
Aantal dingen: RGB(A) gaat veel sneller middels bit shiften!
En websafe maken kan ook nog simpeler eventueel... ;)
en van RGB2HEX:
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...
Aantal dingen: RGB(A) gaat veel sneller middels bit shiften!
Code (php)
En websafe maken kan ook nog simpeler eventueel... ;)
en van RGB2HEX:
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...
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.
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
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
Code (php)
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
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;
?>
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...
@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
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
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...
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...
Je hebt gelijk als je zegt dat er niet gevalideerd hoeft te worden, zeker zolang er geen user input bij komt te kijken.
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.
Quote:
class colors houdt zich bezig met kleuren... geen validatie!
dat doet class validate...
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.
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...
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...
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...
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...
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.
Effecten als Inverse, mix & black-white zouden een mooie toevoeging zijn. Aanroepen gaat bij mij bijvoorbeeld:
Code (php)
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
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);
}
}
?>
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:
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.
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
Labels
- Geen tags toegevoegd.
PHP hulp
0 seconden vanaf nu