Farblayer - Algorithmus
-
Hallo,
ich möchte eine Grafik mit einem Farblayer überziehen. dazu habe ich aktuell einen recht einfachen Algorithmus. Dieser trennt den Farbwert eines Pixels, und den Farbwert des Layers in seine Betsandteile (rot, grün, blau). Für jeden dieser drei Werte werden dann die Layer- und original Pixel-Werte addiert und durch zwei geteilt (original rot + layer rot / 2, original blau + layer blau / 2, usw...). Im Anschluss wird aus den drei neu berechneten Rot, Grün und Blau Werten wieder ein Farbe 'gemischt' und diese dem Pixel zugewiesen.
// layer int mask_r = layerColor.red; int mask_g = layerColor.green; int mask_b = layerColor.blue; // original Pixel int pixelValue = lineData[x]; int r = (pixelValue >> 16) & 0xFF; int g = (pixelValue >> 8) & 0xFF; int b = (pixelValue >> 0) & 0xFF; // Neuer Farbwerte mit der Maske überlagern (Mittelwert) int red = (r + mask_r) / 2; int green = (g + mask_g) / 2; int blue = (b + mask_b) / 2; // neuen Farbwert berechnen int neu = ((red & 0xFF) << 16) | ((green & 0xFF) << 8) | ((blue & 0xFF) << 0);Dieser Agorithmus funktioniert.
Leider hat er de Schwäche, dass alle damit eingefärben Grafiken an Kontrast verlieren. Denn, bei alle hohen Farbwerte, die mit einem niedrigen addiert werden, und das Ergebis durch zwei geteilt wird, haben im Anschluss einen niedrigeren Farbwert.
Daher bin ich auf der Suche nach einem guten Alogrithmus der mein Grafiken besser einfärbt.hat jemand ein gute Idee? Oder weiß es schlicht besser
?Danke!
-
es ist nicht ganz eindeutig was du erreichen willst.
ein moeglicher ansatz: konvertiere beide pixel in ein farbmodell, das intensitaet und farbe trennt, nimm intensitaet von einem, farbe vom anderen und konvertiere zurueck zu rgb.
-
nimm ein farbmodell mit alpha-kanal (rgba) und dann
das hier http://de.wikipedia.org/wiki/Alpha_Blendingggf noch einen schärfungs-filter drüberlaufen lassen, wenn das bild unscharf wird
-
Danke!
Problem: Was bedeutet die Formel unter dem Text:Hat man zwei Farben A und B gegeben und möchte A über B legen, benutzt man folgende Gleichung, um den neuen Wert für die nicht transparente Endfarbe C zu erhalten:

Ich habe leider nicht den rechten Plan, was da was ist und wie's gerehcnet werden soll.
-
im prinzip geht es hier v.a. um subpixel-anteile, also wenn sich pixel nicht vollständig überlagern. im endeffekt kann ein pixel jedoch nur einen farbwert haben, also wird beim alpha-blending eine gewichtete farbe zwischen dem einen flächenanteil der (alten) farbe und dem anteil der (neuen) farbe gewählt.
so wie dein ansatz, du hast halt nzr 50:50 genommen
-
Rechne deine Farbe in den HSL Farbraum um, da drinnen kannst du dann einfach die Farbe, Sättigung und Helligkeit getrennt bearbeiten:
http://en.wikipedia.org/wiki/HSL_color_space
Dann rechnest du wieder nach RGB zurück, fertig.
Alpha Blending ist zum Einfärben nicht geeignet.
-
Nimm einfach für jeden Pixel das Maximum von R, G und B (entspricht der Luminanz) und multipliziere es mit der Farbe deiner Wahl.
lum = max(r_old, g_old, b_old); r_new = lum * r / 256; g_new = lum * g / 256; b_new = lum * b / 256;
-
Danke __Stefan__, das wars!
