Farbanteile berechnen



  • Hi,

    kann ich die Rot-, Grün- und Blauanteile einer Farbe zurückrechnen?
    Jeder Farbanteil hat höchstens den Wert 255(0 ist auch ein Wert).

    256*256*256=16777216 Farbmöglichkeiten (16Bit).

    Gibt es eine Rechenvorschrift?



  • GetRValue, GetGValue, GetBValue ?



  • Naja, die Farbwerte stecken ja in den Bytes deines integer. D.h. du musst nur z.B. mit entsprechenden Bitoperationen eben die Werte der entsprechenden Bytes auslesen...



  • Mit Bitoperationen möchte ich es nicht machen. Die Methoden GetRValue, GetGValue, GetBValue möchte ich auch nicht einsetzen. Es muss doch anders zu bewerkstelligen sein?

    Nochmal langsam. Das ist mein Projekt:

    Ich möchte ein kleines Programm schreiben, dass die jeweiligen RGB-Anteile von 0-255 anzeigt. Zusätzlich gibt es eine Form, in der die jeweilige Farbe angezeigt wird und der Farbwert. Man muss die Farbe mit Hilfe des Farbdialogs auswählen.
    Es geht hier nicht um einen Sinn des Programms (Farbanteile werden schon im Farbdialog angezeigt), sondern um die Berechnung. Ich komme nicht drauf und kann mir auch nicht vorstellen, wie man aus einer einzigen Zahl die Farbanteile extrahieren soll?

    Angeblich sei durch eine "geschickte Wahl von Farben" im Farbauswahldialog der Rechenweg erkennbar, da die Anteile dort angezeigt werden. Nur die RGB-Anteile sind zu berücksichtigen.

    Hier mal ein Bild, wie das Ganze aussieht:
    http://www.loaditup.de/files/547197.jpg



  • Phisherman schrieb:

    Mit Bitoperationen möchte ich es nicht machen.

    Hat das irgendeinen rationalen Grund?

    Phisherman schrieb:

    Ich komme nicht drauf und kann mir auch nicht vorstellen, wie man aus einer einzigen Zahl die Farbanteile extrahieren soll?

    Wo genau liegt da dein Problem? Je nachdem wie das Format aussieht steht eben z.B. der Blauanteil in den untersten 8bit und der Grün- und Rotanteil dann eben nochmal in den entsprechend darauf folgenden 8bit. Wenn die Farbwerte in 4Byte integern stehen schaut das dann halt z.B. so aus (x = unbenutztes bit): xxxxxxxxRRRRRRRRGGGGGGGGBBBBBBBB



  • Hallo

    Es gibt keine schnellere oder passendere Möglichkeit als Bitoperationen bzw. Get*Value (was m.W.n. auch nur ein Makro aus der WinAPI ist, das die Bitoperationen implementiert). Wenn du dich erkundigt hättest, wie denn überhaupt aus den einzelnen RGB-Werten der zugehörige Farbwert gebildet wird (nämlich auch bloß mittels Bitoperation), dann wüßtest du das es keine andere sinnvolle Rechenoperation für den Rückweg gibt.

    bis bald
    akari



  • Nun man könnte statt über Bitoperationen auch über irgendwelche Hacks (Pointerarithmetik + rumgecaste oder die allseits beliebten union Hacks) auf die einzelnen Bytes zugreifen falls es sich um 8Bit RGB Farben handelt. Das wäre aber potentiell langsamer und auf keinen Fall einfacher...



  • dot schrieb:

    Phisherman schrieb:

    Mit Bitoperationen möchte ich es nicht machen.

    Hat das irgendeinen rationalen Grund?

    Phisherman schrieb:

    Ich komme nicht drauf und kann mir auch nicht vorstellen, wie man aus einer einzigen Zahl die Farbanteile extrahieren soll?

    Wo genau liegt da dein Problem? Je nachdem wie das Format aussieht steht eben z.B. der Blauanteil in den untersten 8bit und der Grün- und Rotanteil dann eben nochmal in den entsprechend darauf folgenden 8bit.

    Jepp. Ich hab keine Ahnung, wie das gehen soll. Auch nicht, nachdem ich mir eben etwas von eienr Universität und von Willemers Informatikecke angeschaut habe.

    akari schrieb:

    Hallo

    Es gibt keine schnellere oder passendere Möglichkeit als Bitoperationen bzw. Get*Value (was m.W.n. auch nur ein Makro aus der WinAPI ist, das die Bitoperationen implementiert). Wenn du dich erkundigt hättest, wie denn überhaupt aus den einzelnen RGB-Werten der zugehörige Farbwert gebildet wird (nämlich auch bloß mittels Bitoperation), dann wüßtest du das es keine andere sinnvolle Rechenoperation für den Rückweg gibt.

    bis bald
    akari

    Wieso nicht erkundigt? Ich habe doch geschrieben, wie man die Farbe berechnet: Durch Multiplikation der RGB-Anteile. Wikipedia hat mir auch nicht geholfen (RGB-Farbraum) und die Suchmaschine auch nicht.



  • Phisherman schrieb:

    Ich habe doch geschrieben, wie man die Farbe berechnet: Durch Multiplikation der RGB-Anteile.

    Das ist aber kompletter Schwachsinn.

    Ein 8bit RGB Farbwert in einem 32bit integer schaut eben z.B. so aus (R = rot, G = grün, B = blau, x = unbenutztes bit):

    xxxxxxxxRRRRRRRRGGGGGGGGBBBBBBBB
    

    Mehr gibts da nicht wirklich zu sagen. Und an die einzelnen Bits eines Integer kommst du eben am Besten über Bitoperationen...



  • Phisherman schrieb:

    256*256*256=16777216 Farbmöglichkeiten (16Bit).

    😕



  • kpeter schrieb:

    Phisherman schrieb:

    256*256*256=16777216 Farbmöglichkeiten (16Bit).

    😕

    Jop, Schwachsinn eben...
    Zum einen wären das mindestens 24 Bit (3 * 8 = 24) und zum anderen ist es was andres die Anzahl der möglichen Farbwerte zu berechnen als einen bestimmten Farbwert...



  • dot schrieb:

    kpeter schrieb:

    Phisherman schrieb:

    256*256*256=16777216 Farbmöglichkeiten (16Bit).

    😕

    Jop, Schwachsinn eben...

    Konsens. Da habe ich etwas verwechselt. In der Systemsteuerung werden 16 Millionen Farben als (16Bit)-tiefe Farbtiefe deklariert. Richtig ist in dem Fall 24Bit (8Bit pro Farbanteil). Anstatt zu schreiben, dass es Unfug ist, wäre es netter gewesen zu schreibe, was richtig ist.



  • Phisherman schrieb:

    Anstatt zu schreiben, dass es Unfug ist, wäre es netter gewesen zu schreibe, was richtig ist.

    Das hab ich mittlerweile schon zweimal gemacht...

    dot schrieb:

    Ein 8bit RGB Farbwert in einem 32bit integer schaut eben z.B. so aus (R = rot, G = grün, B = blau, x = unbenutztes bit):

    xxxxxxxxRRRRRRRRGGGGGGGGBBBBBBBB
    

    Mehr gibts da nicht wirklich zu sagen. Und an die einzelnen Bits eines Integer kommst du eben am Besten über Bitoperationen...



  • Mit den o.g. Makros werden aus einem 32-bit-Wert die Farbanteile (24 Bit) ermittelt.
    8 Bit bleiben für einem möglichen Alphakanal-Wert( die xxxxxxxx aus dots Posting).

    Hier sind mal die Makros aus der wingdi.h

    #define GetRValue(rgb)      ((BYTE)(rgb))
    #define GetGValue(rgb)      ((BYTE)(((WORD)(rgb)) >> 8))
    #define GetBValue(rgb)      ((BYTE)((rgb)>>16))
    


  • Danke für die Hilfe.
    Jetzt muss ich das Ganze nur noch auf den TColor Typ transferieren.
    Es handelt sich dabei um eine 4-Byte-Hexadezimalzahl.

    0x00FF0000=Blau
    0x0000FF00=Grün
    0x000000FF=Rot

    0x00FF000 muss dabei nicht berücksichtigt werden.

    Hat das höchstwertige Byte den Wert Null (0x00), erhalten Sie eine Farbe, die derjenigen in der Systempalette am ähnlichsten ist. Ist das höchstwertige Byte Eins (0x01), ergibt das eine Farbe, die derjenigen in der aktuell realisierten Palette am ähnlichsten ist. Wenn Sie das höchstwertige Byte auf Zwei (0x02) setzen, wird der Wert an die ähnlichste Farbe in der logischen Palette des aktuellen Gerätekontexts angepaßt. Quelle: BCB V6 Hilfe

    dot schrieb:

    Phisherman schrieb:

    Anstatt zu schreiben, dass es Unfug ist, wäre es netter gewesen zu schreibe, was richtig ist.

    Das hab ich mittlerweile schon zweimal gemacht...

    Schaue mal, wann ich den Beitrag geschrieben habe und wann du das mit der Farbtiefe editiert hast. 😉



  • Phisherman schrieb:

    Schaue mal, wann ich den Beitrag geschrieben habe und wann du das mit der Farbtiefe editiert hast. 😉

    Zuletzt bearbeitet von dot am 00:18:57 22.10.2010
    Zuletzt bearbeitet von dot am 00:25:11 22.10.2010
    Zuletzt bearbeitet von Phisherman am 00:31:41 22.10.2010

    Zugegeben, es wurde hier in kurzer Zeit recht viel gepostet und editiert aber ich seh das Kausalitätsprinzip im dem Fall nicht verletzt 😉



  • Phisherman schrieb:

    Jetzt muss ich das Ganze nur noch auf den TColor Typ transferieren.

    BCB-Help schrieb:

    The RGB macro selects a red, green, blue (RGB) color based on the arguments supplied and the color capabilities of the output device.



  • Phisherman schrieb:

    Es handelt sich dabei um eine 4-Byte-Hexadezimalzahl. [...]

    Seh ich das richtig dass du genau das suchst was du sowieso schon hast!? Ich mein dein integer aus dem du die Farbwerte extrahieren willst ist doch schon genau so eine 4 Byte Zahl!?



  • @dot: Schaue nochmal genau nach: "Zuletzt bearbeitet von dot am 00:34:20 22.10.2010, insgesamt 3-mal bearbeitet"
    Ist aber gleichgültig.

    dot schrieb:

    Seh ich das richtig dass du genau das suchst was du sowieso hast!

    Inwiefern habe ich das, wonach ich suche?

    @kpeter: Das Makro hilft mir nicht weiter. Ich verfüge nicht über das Wissen dieses zu verwenden.



  • Phisherman schrieb:

    Inwiefern habe ich das, wonach ich suche?

    So wie ich das nun verstanden hab:

    Phisherman schrieb:

    Jetzt muss ich das Ganze nur noch auf den TColor Typ transferieren.
    Es handelt sich dabei um eine 4-Byte-Hexadezimalzahl.

    Du hast:
    RGB Farbwert in einem 4byte integer

    Du suchst:
    RGB Farbwert in einem 4byte integer

    Folgedessen ist mir gerade etwas unklar was überhaupt dein Problem ist und wofür du eigentlich die einzelnen Farbwerte brauchst.

    Phisherman schrieb:

    @kpeter: Das Makro hilft mir nicht weiter. Ich verfüge nicht über das Wissen dieses zu verwenden.

    Dann solltest du dir dieses Wissen wohl aneignen...


Log in to reply