Hallo!
Also es geht darum, dass ich bei einem Bild die Sättigung verändern muss.
Dazu gucke ich mir jeden Pixel an mit einer LookupTable und änder die Werte!
Zuerst habe ich RGB in HSB geändert und S = Saturaion = Sättingung geändert.
Bei meinem 2 Kerne Hobel flitzt das ganze natürlich dahin und braucht so 450MS. (Bei einer Auflösung von 1280x1024).
So, aber auf dem Teil wo die App laufen soll, braucht das ganze schonmal 2.5 Sekunden
.
Bin dann hergegangen und wollte rausfinden wie sich die Sättigung auf die RGB Werte äußert!
Auf dieser Seite hier: http://home.comcast.net/~ed-abramson/14ColorTest/HSB-and-RGB-Colors.html kann man sich prima mit den Reglern spielen!
Mir sind dann folgende Dinger aufgefallen!
.) R = G = B == 0% Sättigung == Wert ändert sich NICHT (50% weniger Sättigung von 0 sind nunmal wieder 0)
.) Der höchste Wert von RGB bleibt immer bestehen!
.) Die anderen 2 Werte ändern sich in der Relation:
Zu berechnender Wert += (Höchster Wert - zu berechnender Wert) / 2 == 50% Sättigung.
Also ist R der höchste Wert sieht die Berechnung von G und B so aus
G = G + (R - G) / 2;
B = B + (R - B) / 2;
Das ganze braucht nun auf der Zielmaschine "nur noch" 1.5 Sekunden! Also 1 Sekunde Zeitersparnis dank wegfallender Umrechnung in HSB und wieder zurück in RGB.
Ich müsste das ganze aber noch schneller machen.
Mein Code sieht so aus:
Wobei INT_SAETTIGER == 2 == 50% ist.
Wie kann ich das ganze noch optimieren?
Habe schon probiert das src[] in eine Hashtable zu putten, aber da ich ne Kopie vom alten src dann brauche, da src wieder das neue ist (und sein muss, da er auf das Array src wieder zurückgreift zum Bild manipulieren und nicht auf das was man returniert), hat sich die Zeit auf meiner Maschine von 400MS auf 780MS fast verdoppelt.
mfg
Also es geht darum, dass ich bei einem Bild die Sättigung verändern muss.
Dazu gucke ich mir jeden Pixel an mit einer LookupTable und änder die Werte!
Zuerst habe ich RGB in HSB geändert und S = Saturaion = Sättingung geändert.
Bei meinem 2 Kerne Hobel flitzt das ganze natürlich dahin und braucht so 450MS. (Bei einer Auflösung von 1280x1024).
So, aber auf dem Teil wo die App laufen soll, braucht das ganze schonmal 2.5 Sekunden
Bin dann hergegangen und wollte rausfinden wie sich die Sättigung auf die RGB Werte äußert!
Auf dieser Seite hier: http://home.comcast.net/~ed-abramson/14ColorTest/HSB-and-RGB-Colors.html kann man sich prima mit den Reglern spielen!
Mir sind dann folgende Dinger aufgefallen!
.) R = G = B == 0% Sättigung == Wert ändert sich NICHT (50% weniger Sättigung von 0 sind nunmal wieder 0)
.) Der höchste Wert von RGB bleibt immer bestehen!
.) Die anderen 2 Werte ändern sich in der Relation:
Zu berechnender Wert += (Höchster Wert - zu berechnender Wert) / 2 == 50% Sättigung.
Also ist R der höchste Wert sieht die Berechnung von G und B so aus
G = G + (R - G) / 2;
B = B + (R - B) / 2;
Das ganze braucht nun auf der Zielmaschine "nur noch" 1.5 Sekunden! Also 1 Sekunde Zeitersparnis dank wegfallender Umrechnung in HSB und wieder zurück in RGB.
Ich müsste das ganze aber noch schneller machen.
Mein Code sieht so aus:
Code:
//Methode tauscht die Pixelfarben um
public int[] lookupPixel(int[] src, int[] dest)
{
int x = 0, y = 0, z = 0;
if(src[0] == src[1] && src[1] == src[2])
{
return src;
}
if(src[0] > src[1] && src[0] > src[2])
{
x = 2;
y = 1;
z = 0;
}
else if(src[1] > src[0] && src[1] > src[2])
{
x = 2;
y = 0;
z = 1;
}
else
{
x = 1;
y = 0;
z = 2;
}
//rechnet die Sättigung zurück (größte Wert von RGB bleibt bestehen, nur die 2 kleineren ändern sich)
src[x] += (src[z] - src[x]) / INT_SAETTIGER;
src[y] += (src[z] - src[y]) / INT_SAETTIGER;
return src;
}
Wobei INT_SAETTIGER == 2 == 50% ist.
Wie kann ich das ganze noch optimieren?
Habe schon probiert das src[] in eine Hashtable zu putten, aber da ich ne Kopie vom alten src dann brauche, da src wieder das neue ist (und sein muss, da er auf das Array src wieder zurückgreift zum Bild manipulieren und nicht auf das was man returniert), hat sich die Zeit auf meiner Maschine von 400MS auf 780MS fast verdoppelt.
mfg