Thread Farbverlauf (19 answers)
Opened by bianca at 2010-02-12 13:59

frankes
 2012-02-13 21:37
#156089 #156089
User since
2005-04-02
140 Artikel
BenutzerIn

user image
Als ganz normale Subroutine die mit einen dreiwertigen Array gefüttert werden. Einmal mit RGB Werten und einmal mit HSV Werten.
Beispiel von unten

Code (perl): (dl )
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;
}

View full thread Farbverlauf