Hola y bienvenido
Roll462011.
Me alegra que ese tutorial acerca de las
transparencias te haya perecido interesante.
Para evitar el parpadeo debes poner
Código Delphi
[-]Form1.Doublebuffered:= true
.
Yo utilizaría un TBitmap temporal para guardar la imagen original de esta manera:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ExtCtrls, jpeg;
type
TForm1 = class(TForm)
Image2: TImage;
Image3: TImage;
TrackBar1: TTrackBar;
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
TmpBitmap: TBitmap;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure DrawSemiTransparent(Canvas: TCanvas; bmp: TBitmap; Percent: integer);
var
bf: BLENDFUNCTION;
begin
bf.BlendOp:= AC_SRC_OVER;
bf.BlendFlags:= 0;
bf.SourceConstantAlpha:= MulDiv($FF, Percent, 100);
bf.AlphaFormat:= 0;
Windows.AlphaBlend(Canvas.Handle, 0, 0, bmp.Width, bmp.Height, bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, bf);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Doublebuffered:= true;
TmpBitmap:= TBitmap.Create;
TmpBitmap.Assign(Image3.Picture.Graphic);
Image3.Picture.Bitmap.Assign(TmpBitmap);
TmpBitmap.Assign(Image2.Picture.Graphic);
TmpBitmap.PixelFormat := pf32bit;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Image2.Picture.Bitmap.Assign(TmpBitmap);
DrawSemiTransparent(Image2.Canvas, Image3.Picture.Bitmap, TrackBar1.Position);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
TmpBitmap.Destroy;
end;
end.
Saludos.