Einzelnen Beitrag anzeigen

Absturzkreatur

Registriert seit: 5. Sep 2008
8 Beiträge
 
#7

Re: Bildeffekt in Delphi nachbauen

  Alt 6. Sep 2008, 21:24
Vielen Dank für die schnellen Hilfen.

In der Zwischenzeit habe ich mich auch natürlich noch auf die Suche nach Lösungen gemacht und eine "Halblösung" gefunden.

In diesem coolen Forum habe ich die Funktion "DrawFrostedGlass" gefunden (www.delphipraxis.net/topic11274.html). Diese habe ich etwas modifiziert und es funktioniert eigentlich schon sehr gut.

Hier der Quelltext:

Delphi-Quellcode:
procedure TForm1.FormClick(Sender: TObject);
var blending, i: Byte;
begin
blending := 250;
for i := 0 to 25 do begin
 Rechteck := Rect(0, 100 + i, Width, 102 + i);
 blending := blending - 10;
 DrawFrostedGlass(Image1.Picture.Bitmap, Rechteck, 16777215, blending);
end;
end;

procedure SplitColorToRGB(const Color: TColor; var r, g, b: Byte);
begin
  r := ColorToRGB(Color) and $0000FF;
  g := (ColorToRGB(Color) and $00FF00) shr 8;
  b := (ColorToRGB(Color) and $FF0000) shr 16;
end;

function RGBToColor(const r, g, b: Byte): TColor;
begin
  Result := TColor(r + (g shl 8) + (b shl 16));
end;

function CalcBlending(const Source, Back, Alpha: Byte): Byte;
begin
  Result := Back + ((Source - Back) * Alpha div 255);
end;

procedure TForm1.DrawFrostedGlass(Bitmap: TBitmap; GlassRect: TRect; const Milk: TColor = clWhite; Alpha: Byte = 128);
var r, g, b: Byte;
    x, y: Integer;
    P: PByteArray;
begin
  with Bitmap.Canvas, Bitmap.Canvas.Pen do begin
    Color := Milk;
    Brush.Style := bsClear;
    rectangle(0, 0, 0, 0); //warum das hier stehen muss, damit der Effekt gezeichnet
                          // wird, verstehe ich auch nicht
  end;

  Bitmap.PixelFormat := pf24Bit;
  GlassRect.Left := (GlassRect.Left * 3) + 3;
  GlassRect.Right := (GlassRect.Right * 3) - 3;
  SplitColorToRGB(Milk, r, g, b);

  for y := GlassRect.Top + 1 to GlassRect.Bottom - 1 do
  begin
    P := Bitmap.ScanLine[y];
    x := GlassRect.Left;
    repeat
      P[x+0] := CalcBlending(P[x+0], r, Alpha);
      P[x+1] := CalcBlending(P[x+1], g, Alpha);
      P[x+2] := CalcBlending(P[x+2], b, Alpha);
      Inc(x, 3);
    until x >= GlassRect.Right;
  end;
end;
Soweit, so gut. Ich habe aber noch ein Problem: Dieser Effekte sollte ovalförmig um das Bild gezeichnet werden. Da ich nun endgültig keinen Plan mehr habe, wie das gehen könnte, bin ich wieder auf eure Hilfe angewiesen.

Vielen Dank
  Mit Zitat antworten Zitat