(Moderator)
Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
Delphi 2006 Professional
|
Re: Durchscheineffekt
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
|
|
Zitat
|