AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Durchscheineffekt

Ein Thema von MatthiasW · begonnen am 4. Okt 2004 · letzter Beitrag vom 4. Okt 2004
Antwort Antwort
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#1

Durchscheineffekt

  Alt 4. Okt 2004, 00:46
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
Miniaturansicht angehängter Grafiken
example1.jpg  
Hilfe wir stürzen ab!!!
  Mit Zitat antworten Zitat
supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Durchscheineffekt

  Alt 4. Okt 2004, 00:59
wo ist da ein durchscheineffekt zu sehen ?
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Durchscheineffekt

  Alt 4. Okt 2004, 01:38
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.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Durchscheineffekt

  Alt 4. Okt 2004, 08:39
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
MatthiasW

Registriert seit: 29. Jan 2003
Ort: Reichenbach
253 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Durchscheineffekt

  Alt 4. Okt 2004, 10:02
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
Hilfe wir stürzen ab!!!
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Durchscheineffekt

  Alt 4. Okt 2004, 12:37
Zitat von SirThornberry:
und zum glück gibt es bei windows dafür schon eine funktion.
Und damit kommst du erst jetzt um die Ecke, wo ich nach sowas in der Art vor ein paar Monaten schon mal gefragt hab!?!?

...dann kanns da ja weiter gehen
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz