[C#] RGB waarde > Named Color

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
afhankelijk van de rgb-waarde, wil ik graag de naam van de kleur (als deze bestaat).
Dit leek me erg eenvoudig, maar toch is het iets lastiger als ik dacht.

Deze code lijkt mij het meest logisch
C#:
1
2
3
4
public string GetColorFromRGB(int R, int G, int B)
{
   return Color.FromArgb(R, G, B).Name;
}

Echter, met de input van (255, 255, 255) is de naam hier FFFFFFFF (alpha is default ook 255).

En in msdn staat dit:
code:
1
2
3
4
5
6
When the ToKnownColor method is applied to a Color structure that is created by 
using the FromArgb method, the ToKnownColor method returns zero, even if the 
ARGB value matches the ARGB value of a pre-defined color. 
The ToKnownColor method also returns zero when it is applied to a Color 
structure that is created by using the FromName method with an invalid 
string name.


Ik snap eigenlijk niet waarom dit is... in ieder geval weet ik nu niet hoe ik toch kan checken of het een bestaande kleur is :?

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

als je in de debugger even de internals van Color bekijkt dan zie je dat het ding bijhoudt of het gecreerd is met een naam of niet.

Je kan alle elementen van de KnownColor enum in een container stoppen en dan een efficiente zoekoperatie doen. Controleer dan natuurlijk even of de operators voor color ook de naam niet gebruiken om zich van elkaar te onderscheiden...

ASSUME makes an ASS out of U and ME


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
H!GHGuY schreef op woensdag 27 december 2006 @ 11:18:
als je in de debugger even de internals van Color bekijkt dan zie je dat het ding bijhoudt of het gecreerd is met een naam of niet.
Als je kijkt naar de volgende 3 properties, geven ze jammer genoeg allemaal false terug... best vaag
C#:
1
2
3
IsKnownColor()
IsNamedColor()
IsSystemColor()
H!GHGuY schreef op woensdag 27 december 2006 @ 11:18:
Je kan alle elementen van de KnownColor enum in een container stoppen en dan een efficiente zoekoperatie doen. Controleer dan natuurlijk even of de operators voor color ook de naam niet gebruiken om zich van elkaar te onderscheiden...
Daar was ik al bang voor. Als er dan niets anders op zit....
Maar ik kan me ook moeilijk voorstellen dat er geen standaard methode voor is.
Is toch echt niet een exotische operatie of zo....

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 27-11 10:50

_Thanatos_

Ja, en kaal

Je kan met Reflection natuurlijk ook alle elementen van de KnownColor enum doorlopen...

日本!🎌


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
_Thanatos_ schreef op woensdag 27 december 2006 @ 12:17:
Je kan met Reflection natuurlijk ook alle elementen van de KnownColor enum doorlopen...
Dat was al gezegd ja :)

Ik probeer nu dit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static string GetKnownColorNameFromRGB(int R, int G, int B)
{
    Array colorsArray = Enum.GetValues(typeof(KnownColor));
    KnownColor[] allColors = new KnownColor[colorsArray.Length];
    Array.Copy(colorsArray, allColors, colorsArray.Length);

    for(int i=0; i<allColors.Length; i++)
    {
        Color color = Color.FromName(allColors[i].ToString());
        if(color.R == R && color.G == G && color.B == B)
            return color.Name;
    }

    return string.Empty;
}

Het irritante is nu dat ik met een input van (255, 255, 255) de kleur ActiveCaptionText terug krijg.
Ten eerste had ik White verwacht, en ten tweede is ActiveCaptionText geen css kleur, terwijl de 3 eerder genoemde booleans wel allemaal true zijn.

[ Voor 64% gewijzigd door CaptBiele op 27-12-2006 13:10 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CaptBiele schreef op woensdag 27 december 2006 @ 12:37:
Ten eerste had ik White verwacht, en ten tweede is ActiveCaptionText geen css kleur, terwijl de 3 eerder genoemde booleans wel allemaal true zijn.
ActiveCaptionText is toch gewoon een named system kleur :? Zit je niet op de verkeerde plek te kijken? ;)

C#:
1
if (color.A == 255 && color.R == R && color.G == G && color.B == B && !color.IsSystemColor)

Geeft white ;)

[ Voor 43% gewijzigd door RobIII op 27-12-2006 14:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
RobIII schreef op woensdag 27 december 2006 @ 14:00:
[...]

ActiveCaptionText is toch gewoon een named system kleur :? Zit je niet op de verkeerde plek te kijken? ;)
Aahh. Het moet dus geen system kleur zijn. Die link had ik nog niet gelegd.... ok, weer wat geleerd! :)

Ik heb nu iig een werkbare oplossing gebaseerd op dit

[ Voor 11% gewijzigd door CaptBiele op 27-12-2006 14:08 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CaptBiele schreef op woensdag 27 december 2006 @ 14:06:
[...]

Nou, die staat dus niet in de css lijst. Zie link vorige post...
Nee, dat klopt ook; het is namelijk een named windows system color ;) Dus een kleur van winforms zeg maar ;) Zie ook hier
CaptBiele schreef op woensdag 27 december 2006 @ 14:06:
Ik heb nu iig een werkbare oplossing gebaseerd op dit :)
Zie de mijne ;)

[ Voor 16% gewijzigd door RobIII op 27-12-2006 14:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
hehe tnx m8. Ik had het al gezien :)

hoe dan ook: het werkt!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Kan je niet ipv door die lus te gaan gebruik maken van Enum.TryParse?

Skill is when luck becomes a habit.

Pagina: 1