tutorials.de Buch-Aktion 05/2012
RSS-Feed anzeigen

Datics Blog

Durschnittsfarbe eines Bildausschnitts ermitteln

Bewerten
von Tobias Menzel am 12.04.07 um 17:38 (460 Hits)
Ich hatte mich schon vor einiger Zeit im Rahmen eines Projekts mit dem Thema befasst und heute im Forum eine modifzierte Version gepostet: Mit den Methoden der BitmapData-Klasse lassen sich Farbwerte eines Bildes auslesen und unter anderem zur Berechnung eines durchschnittlichen Farbwerts nutzen.

Die folgende Methode kann z.B. zum Einfärben des Hintergrunds in einer Galerie oder zur Generierung von Mosaiken eingesetzt werden.
Code actionscript:
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
import flash.display.BitmapData;
 
function parseColors(src, offset_x, offset_y, w, h) {
    var bmp = new BitmapData(src._width, src._height);
    bmp.draw(src);
    var thresh = 0; // Farbschwellenwert
    var sumr = 0;
    var sumg = 0;
    var sumb = 0;
    var minus = 0;
    var amt = w * h;
    for (var x=offset_x; x<offset_x + w; x++) {
        for (var y=offset_y; y<offset_y + h; y++) {
            var pix = bmp.getPixel(x, y);
            var p = pix.toString(16);
            while(p.length < 6) {
                p = "0" + p;
            }
            var cr = parseInt(p.substr(0, 2), 16);
            var cg = parseInt(p.substr(2, 2), 16);
            var cb = parseInt(p.substr(4, 2), 16);
            if (cr > thresh || cg > thresh || cb > thresh) {
                sumr += cr;
                sumg += cg;
                sumb += cb;
            } else {
                minus ++;
            }
        }
    }
    amt -= minus;
    sumr = int(sumr / amt);
    sumg = int(sumg / amt);
    sumb = int(sumb / amt);
    return {r:sumr, g:sumg, b:sumb};
}
Der Funktion werden ein Quell-MovieClip, x- und y-Koordinaten sowie Breite und Höhe des zu untersuchenden Ausschnitts übergeben. Zurückgegeben wird ein Objekt mit den Rot-, Grün- und Blau-Anteilen in den Eigenschaften r, g und b.

Die Variable "thresh" kann eingesetzt werden, um nur Pixel zu "zählen", die eine Mindesthelligkeit aufweisen.

Tipp: Möchte man ein ganzes Bild untersuchen, empfielt es sich, das BitmapData-Objekt mit einer Transformierungsmatrix auf eine erträgliche Größe herunterzuskalieren, da das Auslesen jedes Pixels in einer großen Grafik a) recht lange dauern kann und b) für die Berechnung eines Durchschnittswertes auch nicht nötig ist.

Grüße,

Datic

"Durschnittsfarbe eines Bildausschnitts ermitteln" bei Twitter speichern "Durschnittsfarbe eines Bildausschnitts ermitteln" bei Facebook speichern

Kategorien
Codeschnipsel

Kommentare