Durschnittsfarbe eines Bildausschnitts ermitteln
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.
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.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}; }
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







