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

bianca
 2012-02-13 19:15
#156079 #156079
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Habe den Code noch etwas verbessert.
Aber nochmal die Frage: Wo muss ich "schrauben", um die Farben etwas voller zu bekommen. Gerade grün, blau und rot sind mir etwas zu schwach/fade.
Wer kennt sich mit Farben aus?
Danke
Hier der komplette Code inkl. Testwiese:
more (29.0kb):
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/perl
use strict;
use warnings;
use CGI;

my ($farben);
my $zeilen = '';
my %test = (
    1   => {
        text    => 'Gesamter Verlauf 384 Einheiten rot nach blau',
        anz     => 384,
    },
    2   => {
        text    => 'Gesamter Verlauf 256 Einheiten rot nach grün',
        anz     => 256,
        para    => 1,
    },
    3   => {
        text    => 'Gesamter Verlauf 128 Einheiten rot nach gelb',
        anz     => 128,
        para    => 2,
    },
    4   => {
        text    => '134 Farben von rot nach grün',
        anz     => 134,
        para    => 1,
    },
    5   => {
        text    => '6 Farben von rot nach gelb',
        anz     => 6,
        para    => 2,
    },
    6   => {
        text    => '10 Farben von rot nach blau',
        anz     => 10,
    },
    7   => {
        text    => '10 Farben von rot nach grün',
        anz     => 10,
        para    => 1,
    },
    8   => {
        text    => '10 Farben von rot nach gelb',
        anz     => 10,
        para    => 2,
    },
);

foreach my $testnr (sort {$a <=> $b} keys %test) {
    $zeilen .= "<tr><td>Test $testnr - $test{$testnr}{text}</td></tr>";
    $farben = farbverlauf ($test{$testnr}{anz},(defined $test{$testnr}{para} ? $test{$testnr}{para} : undef));
    $zeilen .= '<tr><td><table cellpadding="0" cellspacing="0" style="border: thin black solid; border-collapse: separate;"><tr>';
    foreach my $nr (@$farben) {
        $zeilen .= '<td title="' . $nr . '" style="background-color: ' . $nr . ';"><img src="../images/trans.gif" width="10" height="10"></td>';
    }
    $zeilen .= '</tr></table></td></tr>';
}

print STDOUT CGI -> new -> header . <<HTML_TEIL
<html>
    <head>
    </head>
    <body bgcolor="white">
    <table>
        <tr><td>Test Farbverlauf</td></tr>
$zeilen
    </table>
    </body>
</html>
HTML_TEIL
;

# ---------------------------------------------------------------------------------------------------------------------
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
    #
    # Wird aufgerufen mit der Anzahl der benötigten Farben und liefert eine Array-Referenz zurück
    #
    # Beispiel:
    # =========
    # my $farben = farbverlauf (4[,1]);
    # print "Farbe 2 = " . $farben -> [2] . "\n";
    # optionaler Parameter: 0 oder undef=von rot nach blau; 1=von rot nach grün; 2=von rot nach gelb
    #
    my $anzahl = $_[0];
    my %config = (
        0   => {
            max     => 384,
        },
        1   => {
            max     => 256,
        },
        2   => {
            max     => 128,
        },
    );
    my $modus = (defined $_[1] && exists $config{$_[1]} ? $_[1] : 0);
    my @arr;
    if ($anzahl > 1) {
        $anzahl = $config{$modus}{max} if $anzahl > $config{$modus}{max};                                       # Minimale Schrittweite darf 1 sein
        my $schritt = int ($config{$modus}{max} / $anzahl + .5);                                                # Schrittweite anhand Anzahl Werte
        for (my $z = 0; $z < $anzahl; $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] - 256;
                $rgb[1] = 255;
            }
            if ($rgb[0] < 128) {                                                                                # Überlauf Links nach rechts schieben
                $rgb[2] += 127 - $rgb[0];
                $rgb[0] = 128;
            }
            push @arr,sprintf ('#%02X%02X%02X',@rgb);
        }
    }
    return \@arr;
}

edit: Das Attachment ist das trans.gif. Aufgrund eines Forumbugs wird es hier im Beitrag in D.gif umbenannt.
Anhänge
image/gif
1 x 1
D.gif

Last edited: 2012-02-13 19:17:09 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Farbverlauf