Leser: 32
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
sub farbverlauf { # # Logik: # ====== # 1. Mitte von 128 bis 255, also FF8080 bis FFFF80 = Rot -> Gelb # 2. Links von 255 runter bis 128, also FFFF80 bis 80FF80 = Gelb -> Grün # 3. Rechts von 128 hoch bis 255, also 80FF80 bis 80FFFF = Grün -> Blau # Ergibt 384 Farben in der gleichen Helligkeit # my $anzahl = shift; my @arr; if ($anzahl > 1) { $anzahl = 385 if $anzahl > 385; # Minimale Schrittweite darf 1 sein my $schritt = int (384 / ($anzahl - 1)); # Schrittweite anhand Anzahl Werte for (my $z = 0; $z < $anzahl - 1; $z ++) { my @rgb = (255,128,128); # Startfarbe fest Rot $rgb[1] = int (128 + ($z * $schritt)); if ($rgb[1] > 255) { # Überlauf Mitte nach links schieben $rgb[0] -= $rgb[1] - 255; $rgb[1] = 255; } if ($rgb[0] < 128) { # Überlauf Links nach rechts schieben $rgb[2] += 128 - $rgb[0]; $rgb[0] = 128; } push @arr,sprintf ('#%02X%02X%02X',@rgb); } } push @arr,'#80FFFF'; # Letzte Farbe soll immer fest Blau sein wg. Rundungsdifferenzen bei Schrittweite return @arr; }
2010-02-12T16:11:43 esskarsieht gut aus.
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
######################rgbtohsv##################### # Umwandeln von rgb (Dezimal) in hsv sub RgbToHsv { #print "Content-Type: text/html; charset=utf-8\n\n<br>"; my @rgb = @_; my ($h,$s,$v) = (0,0,0); my (@mm,@drgb) = (); @rgb = map{$_ *= 1/255 }@rgb; #RGB values = 0 ÷ 255 @mm = sort{$b<=>$a}@rgb; # Min. Max. Value von RGB $v = $mm[1] = $mm[0]-$mm[2]; # Delta in $mm[1] $v = 1; # @mm[1] brachte Warnung # Daher diese Hilfe #This is a gray, no chroma...HSV results = 0 ÷ 1 if ( $mm[1] == 0 ){$h=$s=0} else { #Chromatic data... $s = $mm[1] /$mm[0]; $drgb[0] = ( ( ( $mm[0] - $rgb[0] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Rot $drgb[1] = ( ( ( $mm[0] - $rgb[1] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Grün $drgb[2] = ( ( ( $mm[0] - $rgb[2] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Blau if ( $rgb[0] == $mm[0] ) {$h = $drgb[2] - $drgb[1] } elsif ( $rgb[1] == $mm[0] ) { $h = ( 1 / 3 ) + $drgb[0] - $drgb[2] } elsif ( $rgb[2] == $mm[0] ) { $h = ( 2 / 3 ) + $drgb[1] - $drgb[0] } if ( $h < 0 ){$h += 1} if ( $h > 1 ){$h -= 1} } return ($h,$s,$v); } ######################hsvtorgb##################### # Umwandeln von hsv in rgb (Dezimal) sub HsvToRgb { my @hsv = @_; my (@rgb) = (); my ($var_i,$var_h,$var_r,$var_g,$var_b,$var_1,$var_2,$var_3) = (0,0,0,0,0,0,0,0); if ( $hsv[1] == 0 ){ #HSV values = 0 ÷ 1 $rgb[0] = $hsv[2]*255; $rgb[1] = $hsv[2]*255; $rgb[2] = $hsv[2]*255; } else{ $var_h = $hsv[0] * 6; if ( $var_h == 6 ){$var_h = 0} #H must be < 1 $var_i = int( $var_h ); #Or ... var_i = floor( var_h ) $var_1 = $hsv[2] * (1 - $hsv[1] ); $var_2 = $hsv[2] * (1 - $hsv[1] * ( $var_h - $var_i )); $var_3 = $hsv[2] * (1 - $hsv[1] * ( 1 - ( $var_h - $var_i ))); if ( $var_i == 0 ) { $var_r = $hsv[2]; $var_g = $var_3; $var_b = $var_1;} elsif ( $var_i == 1 ) { $var_r = $var_2; $var_g = $hsv[2]; $var_b = $var_1;} elsif ( $var_i == 2 ) { $var_r = $var_1; $var_g = $hsv[2]; $var_b = $var_3;} elsif ( $var_i == 3 ) { $var_r = $var_1; $var_g = $var_2; $var_b = $hsv[2];} elsif ( $var_i == 4 ) { $var_r = $var_3; $var_g = $var_1; $var_b = $hsv[2];} else { $var_r = $hsv[2]; $var_g = $var_1; $var_b = $var_2;} $rgb[0] = int($var_r * 255); #RGB results = 0 ÷ 255 $rgb[1] = int($var_g * 255); $rgb[2] = int($var_b * 255); } return @rgb; }
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 84 85 86 87 88 89 90 91 92 93 94 95
#!/usr/bin/perl use strict; use warnings; use CGI::Carp qw{fatalsToBrowser}; use CGI qw(:standard); my @rgb = (250,30,250); my @hsv = RgbToHsv(@rgb); my $rgb = join ',',@rgb; my $q = CGI->new; print $q->header; print $q->start_html('hsv <> rgb'); foreach my $i (1..10) { $hsv[1] = $i/10; @rgb = HsvToRgb(@hsv); $rgb = join ',',@rgb; print $q->p({'-style' => "color:rgb($rgb)"},"RGB: $rgb"); } print $q->end_html; ######################rgbtohsv##################### # Umwandeln von rgb (Dezimal) in hsv sub RgbToHsv { #print "Content-Type: text/html; charset=utf-8\n\n<br>"; my @rgb = @_; my ($h,$s,$v) = (0,0,0); my (@mm,@drgb) = (); @rgb = map{$_ *= 1/255 }@rgb; #RGB values = 0 ÷ 255 @mm = sort{$b<=>$a}@rgb; # Min. Max. Value von RGB $v = $mm[1] = $mm[0]-$mm[2]; # Delta in $mm[1] $v = 1; # @mm[1] brachte Warnung # Daher diese Hilfe #This is a gray, no chroma...HSV results = 0 ÷ 1 if ( $mm[1] == 0 ){$h=$s=0} else { #Chromatic data... $s = $mm[1] /$mm[0]; $drgb[0] = ( ( ( $mm[0] - $rgb[0] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Rot $drgb[1] = ( ( ( $mm[0] - $rgb[1] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Grün $drgb[2] = ( ( ( $mm[0] - $rgb[2] ) / 6 ) + ( $mm[1] / 2 ) ) / $mm[1]; #Delta Blau if ( $rgb[0] == $mm[0] ) {$h = $drgb[2] - $drgb[1] } elsif ( $rgb[1] == $mm[0] ) { $h = ( 1 / 3 ) + $drgb[0] - $drgb[2] } elsif ( $rgb[2] == $mm[0] ) { $h = ( 2 / 3 ) + $drgb[1] - $drgb[0] } if ( $h < 0 ){$h += 1} if ( $h > 1 ){$h -= 1} } return ($h,$s,$v); } ######################hsvtorgb##################### # Umwandeln von hsv in rgb (Dezimal) sub HsvToRgb { my @hsv = @_; my (@rgb) = (); my ($var_i,$var_h,$var_r,$var_g,$var_b,$var_1,$var_2,$var_3) = (0,0,0,0,0,0,0,0); if ( $hsv[1] == 0 ){ #HSV values = 0 ÷ 1 $rgb[0] = $hsv[2]*255; $rgb[1] = $hsv[2]*255; $rgb[2] = $hsv[2]*255; } else{ $var_h = $hsv[0] * 6; if ( $var_h == 6 ){$var_h = 0} #H must be < 1 $var_i = int( $var_h ); #Or ... var_i = floor( var_h ) $var_1 = $hsv[2] * (1 - $hsv[1] ); $var_2 = $hsv[2] * (1 - $hsv[1] * ( $var_h - $var_i )); $var_3 = $hsv[2] * (1 - $hsv[1] * ( 1 - ( $var_h - $var_i ))); if ( $var_i == 0 ) { $var_r = $hsv[2]; $var_g = $var_3; $var_b = $var_1;} elsif ( $var_i == 1 ) { $var_r = $var_2; $var_g = $hsv[2]; $var_b = $var_1;} elsif ( $var_i == 2 ) { $var_r = $var_1; $var_g = $hsv[2]; $var_b = $var_3;} elsif ( $var_i == 3 ) { $var_r = $var_1; $var_g = $var_2; $var_b = $hsv[2];} elsif ( $var_i == 4 ) { $var_r = $var_3; $var_g = $var_1; $var_b = $hsv[2];} else { $var_r = $hsv[2]; $var_g = $var_1; $var_b = $var_2;} $rgb[0] = int($var_r * 255); #RGB results = 0 ÷ 255 $rgb[1] = int($var_g * 255); $rgb[2] = int($var_b * 255); } return @rgb; }
2012-02-13T20:37:55 frankesAls ganz normale Subroutine die mit einen dreiwertigen Array gefüttert werden. Einmal mit RGB Werten und einmal mit HSV Werten.