Farbanteile berechnen



  • 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...



  • Phisherman schrieb:

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

    Es ist aber genau das was du suchst. Schau mal ins Archiv.

    Ok, mal ein Bsp:

    DWORD farbe = 1234567;
        int r = GetRValue(farbe);
        int g = GetGValue(farbe);
        int b = GetBValue(farbe);
        TColor clRot   = (TColor) RGB(r, 0 ,0);
        TColor clGruen = (TColor) RGB(0, g ,0);
        TColor clBlau  = (TColor) RGB(0, 0 ,b);
    


  • Dass ich die Farbanteile aus dem TColor-Wert ausrechnen kann, wusste ich nicht. Das war meine Frage. Die Frage, die sich jetzt ergibt ist, wie ich das machen kann (ohne Makro). Bitoperationen scheinen mir auch nicht das Richtige zu sein. Es muss noch eine andere Möglichkeit geben. Damit meine ich keine Kompliziertere.



  • Phisherman schrieb:

    Die Frage, die sich jetzt ergibt ist, wie ich das machen kann (ohne Makro).

    s. Posting akari



  • Phisherman schrieb:

    Bitoperationen scheinen mir auch nicht das Richtige zu sein

    Der Schein trügt...



  • Es ist eine Zusatzaufgabe aus meinem Unterricht. Wir haben Bitoperatoren und Makros noch nicht behandelt. Insofern sollte es auch anders gehen.

    @kpeter: Danke für das Beispiel. Verständlich. Es funktioniert jetzt zwar, aber so richtig verstehe ich es nicht. Wieso sind diese Makros nicht in der Hilfe verzeichnet? Nun bin ich doch neugierig geworden.



  • Phisherman schrieb:

    Es ist eine Zusatzaufgabe aus meinem Unterricht. Wir haben Bitoperatoren und Makros noch nicht behandelt. Insofern sollte es auch anders gehen.

    Wie schon gesagt geht es natürlich auch anders. Anders bedeutet in dem Fall aber auch komplizierter, potentiell ineffizienter und weniger portabel. Bitoperationen sind hier der einzig sinnvolle Weg.



  • Alles klar, danke!
    Auch wenn ich meines Erachtens die Aufgabe nicht "richtig" gelöst habe. Aber dafür könnt ihr ja nichts. Naja, noch 3 Tage Ferien. Dann frage ich die Lehrkraft nach der richtigen Lösung und werde diese dann hier präsentieren.



  • Klar gehts auch ohne Bitoperationen:

    eine Bitweise verschiebung um x nach rechts z.B. ist
    gleichzusetzen einer Division durch 2^x.
    d.h. statt

    ((BYTE)(((WORD)(rgb)) >> 8))
    

    kannst du auch

    ((BYTE)(((WORD)(rgb)) / 256 ))
    

    schreiben.



  • Habt Ihr Unions schon behandelt. Damit könnte man das auch lösen 😉



  • MichelRT schrieb:

    Habt Ihr Unions schon behandelt. Damit könnte man das auch lösen 😉

    Das funktioniert zwar in den mir bekannten Fällen zu 100%, ist aber streng genommen nicht erlaubt und erzeugt undefiniertes Verhalten.

    @Phisherman:
    Der einzig vernünftige Weg sind Bitoperationen. Wenn du das nicht kannst bzw. noch nicht behandelt wurde dann probier´s einfach aus. Schreib´ eine kleine Anwendung zum rumprobieren und guck mal, was verschiedene Operationen/Verschiebungen bewirken. Obwohl die meisten online C++ Tutorials schwach sind sollte dieses Thema ausreichend erlärt werden.


Anmelden zum Antworten