Results 1 to 7 of 7

Thread: kleuren mengen

  1. #1
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916

    kleuren mengen

    Hallo allemaal,

    Ik heb 2 kleuren, bv kleur1 = $00FF8484 en kleur2 = $007B7B7B. Als ik deze kleuren nu in gelijke hoeveelheden wil mengen, zoals bv twee kleuren verf mengen, dan is het denk ik meer dan alleen maar de RGB waardes te middelen. Wat ik nu doe is dus de RGB waarden uit de kleur halen en dan middelen. Dus (R1+R2)/2 etc. Maar de kleuren die ik dan krijg zijn niet helemaal zoals verwacht. Wellicht komt er nog een hoop extra bij kijken.

    Iemand een idee hoe ik dat het beste kan oplossen?

    Alvast bedankt,

    Frank

  2. #2
    Bedoel je zoiets? (gevonden op: http://rmklever.com/?p=116)
    Delphi Code:
    1. // Usage  NewColor:= Blend(Color1, Color2, blending level 0 to 100);
    2. function Blend(Color1, Color2: TColor; A: Byte): TColor;
    3. var
    4.   c1, c2: LongInt;
    5.   r, g, b, v1, v2: byte;
    6. begin
    7.   A:= Round(2.55 * A);
    8.   c1 := ColorToRGB(Color1);
    9.   c2 := ColorToRGB(Color2);
    10.   v1:= Byte(c1);
    11.   v2:= Byte(c2);
    12.   r:= A * (v1 - v2) shr 8 + v2;
    13.   v1:= Byte(c1 shr 8);
    14.   v2:= Byte(c2 shr 8);
    15.   g:= A * (v1 - v2) shr 8 + v2;
    16.   v1:= Byte(c1 shr 16);
    17.   v2:= Byte(c2 shr 16);
    18.   b:= A * (v1 - v2) shr 8 + v2;
    19.   Result := (b shl 16) + (g shl 8) + r;
    20. end;

  3. #3
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    @Reidinga

    Dank je wel, dat doet precies wat ik wil

    Nu wil ik die nieuw berekende RGB waarde invullen voor de GradientRect te doen. Daarvoor moeten de Vertex[0].Red een hexwaarde toegekend worden, dus bv Vertex[0].Red := $FF00.
    Nu loop ik vast hoe dat ik de berekende R, G en B waarden in deze notatie moet omzetten. bv. inttoHex(Byte(c1)) levert een string op die ik daar niet verder kan gebruiken.
    Ik heb van alles geprobeerd maar loop even vast. Wellicht ligt de oplossing zo voor de hand

    gr Frank

  4. #4
    Zoiets? TColor is in volgorde BGR niet RGB (even rekening mee houden )

    Delphi Code:
    1. {
    2.   Met deze code zou je moeten krijgen wat je zoekt:
    3. }
    4. IntToHex( GetRValue(JouwNieuweKleur), 2 );
    5.  
    6.  
    7. {
    8.   Return TColor value in XXXXXX format
    9.   (X being a hex digit)
    10. }
    11. function
    12.   TColorToHex( Color : TColor )
    13.     : string;
    14. begin
    15.   Result :=
    16.     { red value }
    17.     IntToHex( GetRValue( Color ), 2 ) +
    18.     { green value }
    19.     IntToHex( GetGValue( Color ), 2 ) +
    20.     { blue value }
    21.     IntToHex( GetBValue( Color ), 2 );
    22. end;
    23.  
    24. {
    25.   sColor should be in XXXXXX format
    26.   (X being a hex digit)
    27. }
    28. function
    29.   HexToTColor( sColor : string )
    30.     : TColor;
    31. begin
    32.   Result :=
    33.     RGB(
    34.       { get red value }
    35.       StrToInt( '$'+Copy( sColor, 1, 2 ) ),
    36.       { get green value }
    37.       StrToInt( '$'+Copy( sColor, 3, 2 ) ),
    38.       { get blue value }
    39.       StrToInt( '$'+Copy( sColor, 5, 2 ) )
    40.     );
    41. end;

    En als je kijkt naar de Windows Unit waar die GetRValue, GetGValue, en GetBValue vandaan komen zie je dit:
    Delphi Code:
    1. function GetRValue(rgb: DWORD): Byte;
    2. begin
    3.   Result := Byte(rgb);
    4. end;
    5.  
    6. function GetGValue(rgb: DWORD): Byte;
    7. begin
    8.   Result := Byte(rgb shr 8);
    9. end;
    10.  
    11. function GetBValue(rgb: DWORD): Byte;
    12. begin
    13.   Result := Byte(rgb shr 16);
    14. end;
    Last edited by Reidinga; 18-Jan-19 at 16:19.

  5. #5
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    Op gelijksoortige wijze heb ik dat al gedaan maar de IntToHex( GetRValue(Kleur1), 2 ) levert een string waarde op. Voor de gradient Vertex[0].Red moet ik een de volgende notatie hebben $FF00 dus gradient Vertex[0].Red := #FF00. Als ik gradient Vertex[0].Red := 255 schrijf wordt er een verkeerde kleur weergegeven.
    Zie code hieronder die ik gebruik.
    HTML Code:
    type
      PFixedTriVertex = ^TFixedTriVertex;
    
      TFixedTriVertex = packed record
        X,Y    : DWORD;
        Red, Green, Blue, Alpha : word;
      end;
    
    
    var  Vertex: array[0..1] of TFixedTriVertex;
         GradientRect: TGradientRect;
         Kleur1,Kleur2 : TColor;
         c : longint;
         r,g,b  : byte;
    begin
       ......
    
       with Image18 do
      begin
         c := ColorToRGB(Kleur1);
         r := Byte(c);
         g := Byte(c shr 8);
         b := Byte(c shr 16);
    
        Vertex[0].X     := 0;
        Vertex[0].Y     := 0;
        Vertex[0].Red   := r;
        Vertex[0].Green := g;
        Vertex[0].Blue  := b;
        Vertex[0].Alpha := 0;
    
        c := ColorToRGB(Kleur2);
        r := Byte(c);
        g := Byte(c shr 8);
        b := Byte(c shr 16);
    
        Vertex[1].X     := Width;
        Vertex[1].Y     := Height;
        Vertex[1].Red   := r;
        Vertex[1].Green := g;
        Vertex[1].Blue  := b;
        Vertex[1].Alpha := 0;
    
        GradientRect.UpperLeft  := 1;
        GradientRect.LowerRight := 0;
    
        //GradientFillFixed(Canvas.Handle, @Vertex, 2, @GradientRect, 1, GRADIENT_FILL_RECT_H);
        GradientFillFixed(Canvas.Handle, @Vertex, 2, @GradientRect, 1, GRADIENT_FILL_RECT_V);
      end;   

  6. #6
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    oplossing gevonden middels

    HTML Code:
    function VertexRed(Color: TColor; const Factor: Double): Word;
    var
      RCol : Byte;
    begin
      RCol   := GetRValue(ColorToRGB(Color));
      Result := Trunc(RCol / 255 * $FFFF);
    end;
    
    
    function VertexGreen(Color: TColor; const Factor: Double): Word;
    var
      GCol : Byte;
    begin
      GCol   := GetGValue(ColorToRGB(Color));
      Result := Trunc(GCol / 255 * $FFFF);
    end;
    
    
    function VertexBlue(Color: TColor; const Factor: Double): Word;
    var
      BCol : Byte;
    begin
      BCol   := GetBValue(ColorToRGB(Color));
      Result := Trunc(BCol / 255 * $FFFF);
    end;
    
    ......
    
        Vertex[0].Red   := VertexRed(Kleur1, 10);
        Vertex[0].Green := VertexGreen(Kleur1, 10);
        Vertex[0].Blue  := VertexBlue(Kleur1, 10);
    bedankt voor je moeite.

    Gr Frank

  7. #7
    Das een mooi stukje code - die ga ik ff opslaan voor als ik t ooit nodig heb dankjewel om je oplossing te delen

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •