Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Durchscheineffekt (https://www.delphipraxis.net/31074-durchscheineffekt.html)

MatthiasW 3. Okt 2004 23:46


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:
 myColor := HintergrundColor or Vordergrundcolor;

bzw

 myColor := HintergrundColor and Vordergrundcolor;
hat aber leider nicht zum gewünschten ergebnis geführt.

Hat jemand sowas schonmal gemacht und kann mir in paar Tips geben?

Bin für jede Hilfe dankbar

Mfg Matthias

supermuckl 3. Okt 2004 23:59

Re: Durchscheineffekt
 
wo ist da ein durchscheineffekt zu sehen ? :gruebel:

dizzy 4. Okt 2004 00:38

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:
// 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);
Also das arithmetische Mittel zwischen den einzelnen Farbanteilen.

Will man aber, dass z.B. Farbe c1 nicht 50% deckt, sondern beliebig stark, dann wird's ein klein wenig mehr:
Delphi-Quellcode:
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;
Wenn für den Parameter "c1Anteil" 0.5 übergeben wird, ist diese Funktion gleichwertig mit der oberen.

Gruss,
Fabian

\\edit: Korrektur im Code.

SirThornberry 4. Okt 2004 07:39

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:
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;
und hier noch mal eine funktion wenn man nur den wert zwischen 2 farben haben will (wieder mit gamma)
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;

MatthiasW 4. Okt 2004 09:02

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

dizzy 4. Okt 2004 11:37

Re: Durchscheineffekt
 
Zitat:

Zitat von SirThornberry
und zum glück gibt es bei windows dafür schon eine funktion.

:shock: Und damit kommst du erst jetzt um die Ecke, wo ich nach sowas in der Art vor ein paar Monaten schon mal gefragt hab!?!? :cry:

: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