![]() |
Durchscheineffekt
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich möchte einen "Durchscheineffekt" (wie im Bild) realisieren. Wie kann ich die Hintergrund- mit der Vordergrundfarbe verknüpfen? Ich habs versucht mit:
Code:
hat aber leider nicht zum gewünschten ergebnis geführt.
myColor := HintergrundColor or Vordergrundcolor;
bzw myColor := HintergrundColor and Vordergrundcolor; Hat jemand sowas schonmal gemacht und kann mir in paar Tips geben? Bin für jede Hilfe dankbar Mfg Matthias |
Re: Durchscheineffekt
wo ist da ein durchscheineffekt zu sehen ? :gruebel:
|
Re: Durchscheineffekt
Ich denke er meint dieses dunkle "Etwas" links im Bild :).
Um zwei Farben zu vereinen gibt es massig Varianten. Die einfachste und hierbei wohl sinnvollste ist das Überblenden. Wenn das überdeckende Objekt zu 50% durchlässig sein soll, dann errechnet sich deine Farbe so:
Delphi-Quellcode:
Also das arithmetische Mittel zwischen den einzelnen Farbanteilen.
// c1 und c2 seien die zu mischenden Farben
r1 := GetRValue(c1); g1 := GetGValue(c1); b1 := GetBValue(c1); r2 := GetRValue(c2); g2 := GetGValue(c2); b2 := GetBValue(c2); myColor := rgb((r1+r2) div 2, (g1+g2) div 2, (b1+b2) div 2); Will man aber, dass z.B. Farbe c1 nicht 50% deckt, sondern beliebig stark, dann wird's ein klein wenig mehr:
Delphi-Quellcode:
Wenn für den Parameter "c1Anteil" 0.5 übergeben wird, ist diese Funktion gleichwertig mit der oberen.
function MixColors(color1, color2: TColor; c1Anteil: Double): TColor;
var c1, c2: LongInt; c2Anteil: Double; begin if (c1Anteil<0) or (c1Anteil>1) then Exit; // der Anteil wird zwischen 0 und 1 erwartet c2Anteil := 1-c1Anteil; // Das hier verhindert falsche Ergebnisse, falls eine der Farben eine bekannte Farbkonstante // wie z.B. clWhite ist. c1 := ColorToRGB(color1); c2 := ColorToRGB(color2); result := rgb(round(c1Anteil*GetRValue(c1) + c2Anteil*GetRValue(c2)), round(c1Anteil*GetGValue(c1) + c2Anteil*GetGValue(c2)), round(c1Anteil*GetBValue(c1) + c2Anteil*GetBValue(c2))); end; Gruss, Fabian \\edit: Korrektur im Code. |
Re: Durchscheineffekt
und zum glück gibt es bei windows dafür schon eine funktion. Bei folgender Funktion wird eigentlich 2 mal geblendet. Einmal die Bilder und dann nochmal mit weiß (gammavalue)
Delphi-Quellcode:
und hier noch mal eine funktion wenn man nur den wert zwischen 2 farben haben will (wieder mit gamma)
procedure BlendBitmap(Dest: TBitmap; ABlendColor: TColor; ABlendIntensity: Byte = 127; GammaCorrection: Integer = 0);
var LSource: TBitmap; LBlendstruct: TBlendFunction; begin LBlendstruct.BlendOp := AC_SRC_OVER; LBlendstruct.BlendFlags := 0; LBlendstruct.SourceConstantAlpha := ABlendIntensity;// trunc(APercentBlendColor * 255 / 100); LBlendstruct.AlphaFormat := 0; //AC_SRC_ALPHA; LSource := TBitmap.Create; LSource.Width := 1; LSource.Height := 1; LSource.Canvas.Pixels[0,0] := ABlendColor; AlphaBlend(Dest.canvas.handle, 0, 0, Dest.width, Dest.height, LSource.canvas.Handle, 0, 0, 1, 1, LBlendstruct); LSource.Canvas.Pixels[0,0] := clWhite; LBlendstruct.SourceConstantAlpha := GammaCorrection; AlphaBlend(Dest.canvas.handle, 0, 0, Dest.width, Dest.height, LSource.canvas.Handle, 0, 0, 1, 1, LBlendstruct); LSource.Free; end;
Delphi-Quellcode:
function GetBlendColor(Basecolor: TColor; Blendcolor: TColor; BlendIntensity: Byte=127; GammaCorrection: Integer=0): TColor;
function GetValueButMax(AValue: Real; Max: Byte): Byte; begin if AValue > max then result := max else result := trunc(AValue); end; type TMyColor = record red: Byte; green: Byte; blue: Byte; end; var LF1, LF2: TMyColor; begin LF1.red := GetRValue(Basecolor); LF1.green := GetGValue(Basecolor); LF1.blue := GetBValue(Basecolor); LF2.red := (LF1.red * (255-BlendIntensity) + GetRValue(Blendcolor) * BlendIntensity) div 255;// + helligkeit) / 2, 255); LF2.green := (LF1.green * (255-BlendIntensity) + GetGValue(Blendcolor) * BlendIntensity) div 255;// + helligkeit) / 2, 255); LF2.blue := (LF1.blue * (255-BlendIntensity) + GetBValue(Blendcolor) * BlendIntensity) div 255;// + helligkeit) / 2, 255); if GammaCorrection <> 0 then begin LF2.red := (LF2.red * (255-GammaCorrection) + 255 * GammaCorrection) div 255;// + helligkeit) / 2, 255); LF2.green := (LF2.green * (255-GammaCorrection) + 255 * GammaCorrection) div 255;// + helligkeit) / 2, 255); LF2.blue := (LF2.blue * (255-GammaCorrection) + 255 * GammaCorrection) div 255;// + helligkeit) / 2, 255); end; result := rgb(LF2.red, LF2.green, LF2.blue); end; |
Re: Durchscheineffekt
Hallo,
danke für eure schnelle Hilfe, wow. Zu der API - Funktion: steht diese nur bei XP oder auch bei Win2000 zur Verfügung? Mfg Matthias |
Re: Durchscheineffekt
Zitat:
:coder: ...dann kanns da ja weiter gehen ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz