[JAVA] Kleur specificeren in HSV ipv RGB

Pagina: 1
Acties:
  • 388 views sinds 30-01-2008
  • Reageer

  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
Ik wil in mijn java code de kleur specificeren in HSV ipv RGB, omdat ik dan makkelijker een schaling van sterkte kan maken van de kleur. Dan hoef ik namelijk alleen de kleur aan te geven (H) en de waarde (V) blijft altijd op maximaal. Dan kan ik eenvoudig van wit naar een willekeurige kleur schalen door de saturatie (S) van minimum naar maximum te schalen.
Maar ik kom er maar niet uit, hoe ik dit voor elkaar krijg. Ik heb in de API gekeken en kwam met deze code:
code:
1
2
3
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.TYPE_HSV);
float[] colorValues = new float[]{hue, satValue, 100};
Color nodeColor = new Color(colorSpace, colorValues, (float)0);

Maar ik krijg tijdens het uitvoeren deze error:
code:
1
2
Exception in thread "AWT-EventQueue-0"
java.lang.IllegalArgumentException: Unknown color space

Maar het staat wel gewoon in de API die TYPE_HSV.
Hoe krijg ik dan mijn kleur door HSV waarden op te geven?

Systeempje; Ballaida of Avalon in GuildWars


  • ThunderNet
  • Registratie: Juni 2004
  • Laatst online: 14:01

ThunderNet

Flits!

probeer eens TYPE_HSL ... ik heb er zelf nooit naar gewerkt, maar HSL lijkt me een logischere naam dan HSV..

Heb je liever vooraf, of achteraf, dat ik zeg dat ik geen flauw idee heb wat ik doe?


  • Haan
  • Registratie: Februari 2004
  • Laatst online: 29-04 20:35

Haan

dotnetter

float[] colorValues = new float[]{hue, satValue, 100};
Klopt die regel wel?
- { } ipv ( )
- hue met kleine letter?
- satValue ?

Kater? Eerst water, de rest komt later


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
HLS is Hue, Luminance and Saturation
HSV is Hue, Saturation en Value
Dat zijn verschillende colorspace soorten.

Het probleem is hier volgens mij dat alleen van de CS_... types er een colorspace-instantie is, de TYPE_... geven alleen types weer. Je zal dus zelf een colorspace moeten aanmaken.

  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
ThunderNet schreef op zondag 25 september 2005 @ 13:21:
probeer eens TYPE_HSL ... ik heb er zelf nooit naar gewerkt, maar HSL lijkt me een logischere naam dan HSV..
Dat zou dan HLS moeten zijn, maar geeft dezelfde error... En is eigenlijk een andere colourspace dan die ik wil gebruiken.
Haan schreef op zondag 25 september 2005 @ 13:27:
[...]

Klopt die regel wel?
- { } ipv ( )
- hue met kleine letter?
- satValue ?
Ja, dat klopt. hue is een variabele en begint dus idd met een kleine letter.
en satValue staat voor saturationValue. vandaar de a.
Maar als dit fout zou zijn geweest, dan zou dat er bij het compilen uitgekomen moeten zijn denk ik zo.

Systeempje; Ballaida of Avalon in GuildWars


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

ThunderNet schreef op zondag 25 september 2005 @ 13:21:
probeer eens TYPE_HSL ... ik heb er zelf nooit naar gewerkt, maar HSL lijkt me een logischere naam dan HSV..
HLS :)

Maar idd, het lijkt er duidelijk op dat hij de color space niet kent (dat zegt de error toch ook?) Dus waarschijnlijk is TYPE_HSV niet bekend, misschien TYPE_HLS wel.

offtopic:
spuit 11 enzo

[ Voor 4% gewijzigd door Zoijar op 25-09-2005 13:35 ]


  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
Remus schreef op zondag 25 september 2005 @ 13:33:
HLS is Hue, Luminance and Saturation
HSV is Hue, Saturation en Value
Dat zijn verschillende colorspace soorten.

Het probleem is hier volgens mij dat alleen van de CS_... types er een colorspace-instantie is, de TYPE_... geven alleen types weer. Je zal dus zelf een colorspace moeten aanmaken.
Ik zal toch niet de enige java programmeur zijn die HSV wil gebruiken ipv RGB?

Systeempje; Ballaida of Avalon in GuildWars


  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Balachmar schreef op zondag 25 september 2005 @ 13:35:
[...]

Ik zal toch niet de enige java programmeur zijn die HSV wil gebruiken ipv RGB?
Als ik in de API documentatie kijk dan is er een duidelijk onderscheid tussen de CS_ constanten en de TYPE_ constanten. Ik neig ernaar (let wel ik heb nog nooit met colorspace gewerkt!) dat je zelf een colorspace moet aanmaken met new ColorSpace(TYPE_HSV, num_components) waarbij num_components een int is waarbij mij niet helemaal duidelijk is wat het precies doet :)

Verwijderd

Je kan altijd nog zelf met de kleuren gaan rekenen.

De vergelijkingen daarvoor kun je vast wel ergens vinden op het internet.

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Mocht je het toch handmatig willen doen:
C++:
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
// See 'Computer Graphics: Principles and Practice' - Foley et al. - p596.
// Input sat/li in [0,1], hue in [0,360]. Output r/g/b in [0,255]
void TextureGenerator::HSLtoRGB(float hue, float sat, float li, char* rgb) const {
    float tmp1, tmp2;

    if (sat > 0.0f) {
        if (li < 0.5f) {
            tmp2 = li*(1.0f+sat);
        } else {
            tmp2 = (li+sat) - (li*sat);
        }
        tmp1 = (2.0f*li) - tmp2;

        rgb[0] = static_cast<unsigned char>(hslValue(tmp1, tmp2, hue + 120.0f) * 255);
        rgb[1] = static_cast<unsigned char>(hslValue(tmp1, tmp2, hue         ) * 255);
        rgb[2] = static_cast<unsigned char>(hslValue(tmp1, tmp2, hue - 120.0f) * 255);
    } else {
        // No saturation, so only lightness counts (we see no color)
        rgb[0] = rgb[1] = rgb[2] = static_cast<unsigned char>(255*li);
    }
}

float TextureGenerator::hslValue(float tmp1, float tmp2, float hue) const {
    // Translate hue back to [0,360]
    if (hue > 360.0f) hue -= 360.0f;
    else if (hue < 0.0f) hue += 360.0f;

    if (hue < 60.0f)
        return tmp1 + (tmp2-tmp1) * hue / 60.0f;
    else if (hue < 180.0f)
        return tmp2;
    else if (hue < 240.0f)
        return tmp1 + (tmp2-tmp1) * (240.0f - hue) / 60.0f;
    else
        return tmp1;
}


Overigens geeft LCH (luminance, chroma, hue) vaak mooiere/betere resultaten, en is ook intuitief te specificieren. Interpolatie werkt beter in deze color space. Nadeel is dat de berekeningen nogal complex zijn (LCH -> Lab -> CIE XYZ -> sRGB -> gamma corrected RGB), voordeel is dat je ook in principe ICC profiles kan gebruiken bij het omzetten van XYZ naar (s)RGB/(ICC)RGB. Misschien dat Java dit wel rechtstreeks ondersteunt.

[ Voor 22% gewijzigd door Zoijar op 25-09-2005 14:12 ]


Verwijderd

Heb je Google al gebruikt? Ik kom uit op 1 of andere library die een klasse ColorUtils bevat. Deze heeft een methode die gegeven een h, s en v waarde de rgb waarde retourneert.. dat is toch wat je wilt :)

[ Voor 33% gewijzigd door Verwijderd op 25-09-2005 15:09 ]


  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
Verwijderd schreef op zondag 25 september 2005 @ 15:07:
Heb je Google al gebruikt? Ik kom uit op 1 of andere library die een klasse ColorUtils bevat. Deze heeft een methode die gegeven een h, s en v waarde de rgb waarde retourneert.. dat is toch wat je wilt :)
Jazeker had ik Google al gebruikt, maar ik geef persoonlijk altijd de voorkeur aan het zoveel mogelijk gebruiken van de normale java code. En aangezien het in de API er zeker op leek dat dat moest kunnen, wilde ik dat eerst proberen. Toch heb ik trouwens die library die jij had gevonden zelf niet gevonden.

Systeempje; Ballaida of Avalon in GuildWars


Verwijderd

Als je handig gebruik maakt van Google dan kom je al snel achter de juiste implementaties, zonder gebruik van een 3rd-party API! Er is genoeg te vinden.. Wat wil je nog meer :)

[ Voor 5% gewijzigd door Verwijderd op 25-09-2005 21:49 ]


  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
Verwijderd schreef op zondag 25 september 2005 @ 21:48:
Als je handig gebruik maakt van Google dan kom je al snel achter de juiste implementaties, zonder gebruik van een 3rd-party API! Er is genoeg te vinden.. Wat wil je nog meer :)
Tja, ik moet toegeven, dat ik niet wist dat HSV gelijk is aan HSB.
Waarom noemen ze het dan niet hetzelfde?

Je moet dus gewoon gebruiken maken van:
HSBtoRGB(float hue, float saturation, float brightness)
Converts the components of a color, as specified by the HSB model, to an equivalent set of values for the default RGB model.
in Color

[ Voor 18% gewijzigd door Balachmar op 26-09-2005 09:23 ]

Systeempje; Ballaida of Avalon in GuildWars


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Google? Wel eens de oficiele api bekeken?

Ja HSB is hetzelfde als HSV. Brigthness en Value zijn hetzelfde.

[ Voor 9% gewijzigd door Janoz op 26-09-2005 09:25 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Balachmar
  • Registratie: Mei 2002
  • Laatst online: 21-03 16:52

Balachmar

The truth is out there

Topicstarter
Janoz schreef op maandag 26 september 2005 @ 09:24:
Google? Wel eens de <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Color.html#HSBtoRGB(float, float, float)" target="_blank">oficiele api</a> bekeken?

Ja HSB is hetzelfde als HSV. Brigthness en Value zijn hetzelfde.
Ja, had ik dus wel allemaal gedaan, maar als je niet weet en nergens vind dat HSV gelijk is aan HSB, dan kom je nog nergens. En het wordt er dan echt niet duidelijker op dat er voor beide namen een TYPE_ Colorspace is. zowel TYPE_HSV bestaat als TYPE_HSB.
Mede daardoor, dacht ik dat het om een (iets) andere colorspace ging.

Systeempje; Ballaida of Avalon in GuildWars


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 29-04 08:14

Janoz

Moderator Devschuur®

!litemod

Wen er maar aan ;). Op het relatief nieuwe gebied van computer graphics zijn veel termen nog neit uitgedestileerd en zijn er dus nog veel verschillen in gebruikte manieren en termen. Het loont zeker om, zondra iets niet helemaal hetzelfde is, verder te kijken.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Ik zie in de docs van de class ColorSpace geen TYPE_HSB. Bovendien staat hier dat je alleen de predefined colorspaces (de constants die met CS_ beginnen) als laatste parameter aan getInstance mee kan geven.

Wie trösten wir uns, die Mörder aller Mörder?

Pagina: 1