Avatar billede mortennobel Nybegynder
30. oktober 2007 - 15:58 Der er 5 kommentarer

Hue Saturation Brightness effekt a la photoshop

Jeg sidder og laver et image-filter som skal virke på samme måde som Hue/Saturation justeringen i Photoshop.

Men Brightness (eller Lightness som photoshop kalder det) driller lidt.
Hvis man i Photoshop sætter Lightness til 100 bliver hele billedet hvidt. I nedenstående kode bliver brightness bare sat til 100 hvilket ikke nødvendigvis er hvid.
Er der nogen som hjælpe mig med at omskrive mit simple javakode til at virke på samme måde?

public int doHSB(int rgb, float hue, float saturation, float brightness){
    float[] hsbvals = new float[3];// contains the hsb components
    Color.RGBtoHSB((rgb>>16)&0xff, (rgb>>8)&0xff,rgb&0xff,hsbvals);
    float newHue =        hsbvals[0] + hue+1.0f;
    float newSaturation = Math.min(Math.max( hsbvals[1] + saturation,0.0f),1.0f);
    float newBrightness = Math.min(Math.max( hsbvals[2] + brightness,0.0f),1.0f);

    return (Color.HSBtoRGB(newHue, newSaturation, newBrightness)&0xffffff)|(rgb&0xff000000);
}
Avatar billede nielle Nybegynder
30. oktober 2007 - 18:58 #1
Må jeg forslå at du flytter spørgsmålet til Java-kategorien?

http://www.eksperten.dk/spm/Programmering/Java/
Avatar billede mortennobel Nybegynder
30. oktober 2007 - 21:55 #2
Jeg valgte generel programmering, da jeg mest af alt søger at finde ud af hvordan algoritment fungerer i photoshop. At oversætte det til java er det mindste. Jeg går ud fra at java er langt fra det eneste sprog, hvor farver kan gemmes i en int.

Jeg har fået en ide, som bringer mig lidt nærmere (stadig ikke helt photoshop agtigt).
I stedet for at regne brigtness ud, på ovenstående måde, så bibeholder jeg brightness. Konverterer hsb til rgb og beregner brightness for hver farve vha. nedenstående:

private int lightness(float lightness, int newColor) {
    if (lightness>0){ // lighter
        int r = (newColor>>16)&0xff;
        int g = (newColor>>8)&0xff;
        int b = newColor&0xff;
        int newR = r+(int)((0xff-r)*lightness);
        int newG = g+(int)((0xff-g)*lightness);
        int newB = b+(int)((0xff-b)*lightness);
        newColor = (Math.min(255,newR)<<16)|(Math.min(255,newG)<<8)|(Math.min(255,newB));
    }
    else if (lightness<0){// darker
        float l = lightness+1;
        newColor = (((int)((newColor&0xff0000)*l))&0xff0000) | // red
                (((int)((newColor&0xff00)*l))&0xff00) | // green
                (((int)((newColor&0xff)*l))&0xff);// blue
    }
    return newColor;
}
Avatar billede nielle Nybegynder
30. oktober 2007 - 22:06 #3
Problemet med at vælge kategori er at det ikke er alle der følger med i alle kategorier. :^)
Avatar billede mortennobel Nybegynder
30. oktober 2007 - 22:43 #4
Men kan man flytte et spørgsmål eller skal det oprettes igen?
Avatar billede nielle Nybegynder
30. oktober 2007 - 22:50 #5
Det skal desværre oprettes igen :^|
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester