TImage Hintergrundfarbe



  • Hallo,

    wo ist die Hintergrundfarbe definiert. Ich habe ein Formular mit einem TImage und möchte die Hintergrundfarbe ermitteln. Mit dem gleichen Programm bekomme ich bei einem Rechner mit NT4.0 als RGB Wert 198 195 198, bei einem anderen mit W2K 212 208 200 und bei einem 3. Rechner 214 211 206. Die Farbe clBackground ist auch eine andere.

    Wodurch wird denn diese Farbe beeinflusst bzw. wo kann ich den Wert immer und sicher auslesen. Mit Canvas->Pixels komm ich an die Farbe ran, aber nur wenn das Image noch leer ist. Die muss doch irgendwo auch als vordefinierte "cl...." Farbe existieren.

    Gruß WoWe



  • Üblicherweise ist ein (leeres) TImage doch transparent. Du müsstest dir also die Farbe des Parent-Controls holen.



  • Also deine Werte, die du da hast, ist immer der gleiche, und zwar clBtnFace, was so viel heißt, wie Fensterfarbe. Diese kannst du so verändern:

    Image1->Canvas->Brush->Color=...; /*
    Canvas ist der Bereich auf dem Gezeichnet werden kann
    Brush ist die Füllung
    und Color eben die Füllfarbe
    */
    


  • Also irgendwie raff ich das nicht. Wenn ich die Brush->Color auslese bekomme ich irgend einen Wert, sowie bei clBtnFace bekomme ich 0x8000000F. Ich brauche aber den RGB Wert:

    // Hier soll die Hintergrundfarbe definiert werden
        clBackgroundColor = Image1->Brush->Color;
        clBackgroundColor = Image1->Parent->Brush->Color;
    
        // Pixelfarbe von TImage wird gelesen
        PixelColorRGB = Image1->Canvas->Pixels[x][y];
        // Nur wenn Pixelfarbe != Hintergrundfarbe, d.h. dieser Pixel wurde überschrieben
        if ( PixelColorRGB != clBackgroundColor )
    


  • TColor *Farbe=(TColor)0x000000FF
    
    String RGBStr[3]; //String für Farben
    int RGBInt[3]; //Int für RGB-Werte
    
    // In Farbe steht z.B. Knallrot, umgekehrter RGB-Wert, also BGR
    
    RGBStr[2]=ColorToString(Farbe).SubString(4,2); //Blau
    RGBStr[1]=ColorToString(Farbe).SubString(6,2); //Grün
    RGBStr[0]=ColorToString(Farbe).SubString(8,2); //Rot
    
    //Umwandlung:
    
    RGBInt[0]=HexToInt(RGBStr[0]);
    RGBInt[1]=HexToInt(RGBStr[1]);
    RGBInt[2]=HexToInt(RGBStr[2]);
    
    //Ausgabe:
    
    Label1->Caption="Rot: "+IntToStr(RGBInt[0]+"\nGrün: "+IntToStr(RGBInt[1]+"\nBlau: "+IntToStr(RGBInt[2];
    
    /* ---Es steht also da:---
    
    Rot: 255
    Grün: 0
    Blau: 0
    
    --- */
    
    /* Nachteil: Es darf keine Vordefinierte Farbe sein, also z.B. clRed (0x000000F0) - RGB: {240,0,0}*/
    

    [ Dieser Beitrag wurde am 23.06.2003 um 13:02 Uhr von Spieleprogrammierer editiert. ]



  • @spieleprogrammierer

    so ein mumpitz!

    um RGB aus nem TColor-Wert zu ermitteln, gibt es ColorToRGB. danach kann man mit GetRValue, GetGValue und GetBValue die einzelnen farbwerte auslesen!

    int rgb = ColorToRGB(clBtnFace);
    
    ShowMessage(GetRValue(rgb));
    ShowMessage(GetGValue(rgb));
    ShowMessage(GetBValue(rgb));
    


  • Hallo Spieleprogrammierer,

    du hast mich falsch verstanden. Wie ich von TColor auf die einzelne RGB Werte komme, das ist mir schon klar, aber z.B. clBtnFace = 0x8000000f ist ja kein Farbwert als solcher, der wird erst später zugewiesen, clBtnFace = clSilver = 0x00c0c0c0 (so steht's bei TColor in der Hilfe).

    Wenn ich mit "PixelColorRGB = Image1->Canvas->Pixels[x][y]" den Farbwert des leeren Image1 auslese bekomme ich eben (siehe oben) auf jedem Rechner andere Werte und ich suche danach wo ich den aktuellen Hintergrund-Farbwert des leeren TImage auslesen kann.

    Gruß WoWe



  • @Sunday, das ist kein "Mumpits", so wie du's erzählst gehts natürlich auch, ist die einfachere vasriante, aber meins ist auch wahr. Und clBtnFace ist eben nicht immer clSilver, bei Win98 oder Win NT vielleicht, aber bei XP z.B. nicht. Und wenn du den RGB-Wert des aktuellen Punktes haben willst, dann mach's so, wie es Sunday bereits sagte:

    int rgb;
    rgb=ColorToRGB(Image1->Canvas->Pixels[X][Y]);
    Label1->Caption=IntToStr(GetRValue(rgb))+","+IntToStr(GetGValue(rgb))+","+IntToStr(GetBValue(rgb));

    Und die Hintergrundfarbe vom leeren TImage ist transparent, er liefert dir also den Wert der Farbe hinter dem TImage, in dem Falle clBtnFace.



  • Hallo ihr zwei,

    vielen Dank ! Das war's. Ich hatte es schon mit der direkten Zuweisung " clBackgroundColor = clBtnFace;" probiert, aber da bekomme ich eben den falschen wert.


Anmelden zum Antworten