Thema: Delphi Durchscheineffekt

Einzelnen Beitrag anzeigen

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